题目:
有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
输出可以容纳的最大价值。
Input示例
3 6
2 2 5
3 3 8
1 4 1
Output示例
9
多重背包问题:
<span style="font-size:24px;">#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"algorithm"
#include"ctype.h"
const int maxn=102;//物品数量
const int maxv=50000+2; //背包容量
int c[maxn],w[maxn],num[maxn];
int n,V;
int F[maxv];
int max(int a,int b)
{
return a>b?a:b;
}
void print()
{
for(int i=1;i<=V;i++)
printf("%d ",F[i]);
printf("\n");
}
void ZeroOnePack(int c,int w) //重量、价值
{//01背包考虑第i件物品
for(int i=V;i>=c;i--)
F[i]=max(F[i],F[i-c]+w);
}
void CompletePack(int c,int w)
{//完全背包
for(int i=c;i<=V;i++)
F[i]=max(F[i],F[i-c]+w);
}
void MultiplePack(int c,int w,int m)
{ //多重背包
if(c*m>=V)
{
CompletePack(c,w);
// print();
}
else
{
int k=1;
while(k<m)
{
ZeroOnePack(k*c,k*w);
m-=k; //记录剩下的
k=k*2;
// print();
}
ZeroOnePack(m*c,m*w);
//print();
}
}
int main()
{
scanf("%d%d",&n,&V);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&c[i],&w[i],&num[i]);
for(int i=1;i<=n;i++)
MultiplePack(c[i],w[i],num[i]); //O(Vlogm)
printf("%d\n",F[V]);
return 0;
}</span>