1086 背包问题 V2
有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。
收起
输入
第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)
输出
输出可以容纳的最大价值。
输入样例
3 6 2 2 5 3 3 8 1 4 1
输出样例
9
这和我之前写的那个汶川大地震一样https://blog.csdn.net/aini875/article/details/81254445
都是多重背包问题。但是呢,我超时了,这个多重背包得进行拆分,不然数据上面过不了,
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<queue>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
int wi,pi,ci;
int w1[10010],v1[10010],dp[50010];
using namespace std;
int main()
{
int N,W;
int num=0;
scanf("%d%d",&N,&W);
for(int i=1; i<=N; i++)
{
scanf("%d%d%d",&wi,&pi,&ci);
for(int j=1;; j*=2)
{
if(ci>=j)
{
w1[num]=j*wi;
v1[num]=j*pi;
ci-=j;
num++;
}
else
{
w1[num]=ci*wi;
v1[num]=ci*pi;
num++;
break;
}
}
}
for(int i=0; i<num; i++)
{
for(int j=W; j>=w1[i]; j--)
dp[j]=max(dp[j],dp[j-w1[i]]+v1[i]);
}
printf("%d\n",dp[W]);
return 0;
}