多重背包

有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。

Input

  第1行,2个整数,N和W中间用空格隔开。N为物品的种类,W为背包的容量。(1 <= N <= 100,1 <= W <= 50000) 
第2 - N + 1行,每行3个整数,Wi,Pi和Ci分别是物品体积、价值和数量。(1 <= Wi, Pi <= 10000, 1 <= Ci <= 200)

Output

  输出可以容纳的最大价值。

Sample Input

3 6
2 2 5
3 3 8
1 4 1

Sample Output

9


当有c个时,让k变成,1,2,4..c-k+1,比如13,就可以让13变成1,2,4,6,这样算。如果13个全部转化为01背包的话有13个,这样的话就只有4个了。
 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdio.h>
 4 using namespace std;
 5 const int MAX = 50000+5;
 6 int dp[MAX];
 7 
 8 int main(){
 9     int n, ww,w,p,c;
10     scanf("%d %d",&n,&ww);
11     for(int i = 0; i < n; i ++){
12         scanf("%d %d %d",&w,&p,&c);
13         for(int k = 1, flag =1;; k*=2){
14             if(k*2 >= c){
15                 k = c-k+1;
16                 flag = 0;
17             }
18             //cout << k << ' ' ;
19             for(int j = ww; j >= k*w; j --){
20                 dp[j] = max(dp[j],dp[j-k*w]+k*p);
21             }
22             if(flag == 0)break;
23         }
24         //cout << endl;
25     }
26     printf("%d\n",dp[ww]);
27     return 0;
28 }

 

posted @ 2017-07-17 09:54  starry_sky  阅读(208)  评论(0编辑  收藏  举报