多重背包问题,谢谢各位了
3 多重背包问题
3.1 题目
有N 种物品和一个容量为V 的背包。第i 种物品最多有Mi 件可用,每件耗费的
空间是Ci,价值是Wi。求解将物品装入背包可使这些物品的耗费的空间总和不超
过背包容量,且价值总和最大,输出最大价值总和。
动态方程为f[i][j]=max{f[i-1][j-k*v[i]]+k*w[i]}其中(0=<k<=Mi)
我用一维数组存储的
#include<stdio.h>
#define N 20
int main()
{
int n,i,j,w[N],v[N],m[N],f[1000],V;
scanf("%d",&V); //包的容量
scanf("%d",&n); //有几种物品
for(i=1;i<=n;i++)
scanf("%d%d%d",v[i],w[i],m[i]);//物品的所占容积大小,价值,有几件
for(i=0;i<=V;i++)//初始化
f[i]=0;
for(i=1;i<=n;i++)
{
if(v[i]*m[i]>=V) //完全背包
{
for(j=1;j<v[i];j++)
f[j]=f[j-1];
for(j=v[i];j<=V;j++)
{
if(f[j]<f[j-v[i]]+w[i])
f[j]=f[j-v[i]]+w[i];
}
}//if
else //01背包
{
int k=0;
while(k<=m[i])
{
for(j=V;j>=v[i];j--)
if(f[j]<f[j-v[i]]+w[i])
f[j]=f[j-v[i]]+w[i];
k++;
} //while
} //else
} //for
printf("%d\n",f[V]);
getchar();
getchar();
return 0;
}
我是dev c++的编译器,只说错了,不告诉错在哪里了,麻烦谁有这个编译器发过来,我之前下个一个还是本能用,万分感谢了!嘻嘻嘻。。。