随笔-65  评论-6  文章-0  trackbacks-0
 1 /*
 2 Author:    Leo.W
 3 Descriptipn:    买米,给出k种大米的价格、重量、最大袋数,求在m元钱下买的重量最大的米。
 4 How to Do:    多重背包问题。dp[j]=max{dp[j-k*c[i]]+k*w[i]}
 5   */
 6 #include <iostream>
 7 #include <string.h>
 8 #include <algorithm>
 9 using namespace std;
10 #define max(a,b) (a)>(b)?(a):(b)
11 int c[102],w[102],p[102];
12 int dp[102];
13 void zeroOne(int i,int n){
14     int j,k;
15     for(j=n;j>=c[i];j--){
16         for(k=1;k<=p[i];k++){
17             if(j-k*c[i]>=0)
18                 dp[j]=max(dp[j],dp[j-k*c[i]]+k*w[i]);
19         }
20     }
21 }
22 void complete(int i,int n){
23     int j,k;
24     for(j=c[i];j<=n;j++){
25         for(k=1;k<=p[i];k++){
26             if(j-k*c[i]>=0)
27                 dp[j]=max(dp[j],dp[j-k*c[i]]+k*w[i]);
28         }
29     }
30 }
31 int main(){
32     //freopen("in.txt","r",stdin);
33     int t;
34     scanf("%d",&t);
35     while (t--){
36         int i;
37         int n,m;
38         scanf("%d%d",&n,&m);
39         for(i=0;i<m;i++)    scanf("%d%d%d",&c[i],&w[i],&p[i]);
40         memset(dp,-1,sizeof(dp));
41         dp[0]=0;
42         for(i=0;i<m;i++){
43             if(c[i]*p[i]<=n)
44                 zeroOne(i,n);
45             else
46                 complete(i,n);
47         }
48         printf("%d\n",dp[n]);
49     }
50     return 0;
51 }
52 
posted on 2012-03-13 22:02 Leo.W 阅读(503) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理