csu1086: 超市购物

1086: 超市购物

Time Limit: 1 Sec Memory Limit: 128 MB
SUBMIT: 130 Solved: 52
[SUBMIT][STATUS]

Description

上次去超市扫荡回来的东西用完了,Staginner又得跑超市一趟,出发前他列了一张购物清单,打算去买K种不同的商品,每种买一件。到了超市,Staginner发现每种商品有N个品牌,每个品牌此商品的价格为Vi,对Staginner的作用值为Wi,他会从这N个品牌里面挑一个品牌买。这时,Staginner突然想起出门时只带了M元钱,又懒得去取钱了,所以不一定能买完K种商品,只好尽可能地让买的东西对自己的总作用值ans最大。

Input

多组样例。

第一行两个整数K,M代表Staginner想买的不同种类商品的数目和他带的钱 (0 < K <= 30, 0 < M <= 2000)
以下输入分为K个部分,代表K种商品。
每个部分第一行为一个数字N,代表第k种商品的N个品牌,N不大于10。之后跟着N行,每行两个数字,代表物品的价格Vi和作用值Wi。其中 0 < Vi < M。

Output

输出Case #: 最大总作用值,每两个样例之间有一个空行。

Sample Input

3 100
3
50 600
20 700
30 800		
2
30 500
40 600	
1
60 200

2 500
2
200 1000
260 1200
1
280 300

Sample Output

Case 1: 1400

Case 2: 1300
链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1086
思路:赤裸裸的多组背包。状态方程dp[i][j]=maxx(dp[i][j],dp[i-1][j-v[i][k]]+w[i][k]);
代码:
 1 #include <stdio.h>
 2 int v[2002][2002],w[2002][2002];
 3 int dp[2002][2002]; 
 4 int maxx(int a,int b) 
 5 {     
 6     if(a<b)     
 7         a=b;    
 8     return a; 
 9 } 
10 int main() 
11 {     
12     int i,j,m,n,k,ccc=1;   
13     while(scanf("%d%d",&m,&n)!=EOF)  
14     {         
15         for(i=0;i<=m;i++)  
16         {           
17             for(j=0;j<=n;j++)   
18             {                
19                 dp[i][j]=0;     
20             }      
21         }       
22         int x[2002];  
23         for(i=1;i<=m;i++)  
24         {          
25             scanf("%d",&x[i]); 
26             for(j=1;j<=x[i];j++)   
27             {                
28                 scanf("%d%d",&v[i][j],&w[i][j]);   
29             }       
30         }       
31         for(i=1;i<=m;i++)    
32         {           
33             for(j=n;j>=0;j--)    
34             {           
35                 dp[i][j]=dp[i-1][j];
36                 for(k=1;k<=x[i];k++) 
37                 {            
38                     if(j-v[i][k]>=0) 
39                         dp[i][j]=maxx(dp[i][j],dp[i-1][j-v[i][k]]+w[i][k]); 
40                 }         
41             }     
42         }        
43         int max=0;       
44         printf("Case %d: ",ccc);   
45         printf("%d\n\n",dp[m][n]);  
46         ccc++;   
47     }   
48     return 0;
49 } 

 

posted @ 2012-07-21 21:45  hnust_tongguang  阅读(303)  评论(0编辑  收藏  举报