多重背包问题 求代码
。
现在你有M元钱,可以采购N种物品,每种物品最多可以购买Ai件(也可以不购买),
每购买一件会花费Ci元,并能产生Vi的价值。请算出你能买的物品的最大价值和。
【输入】
输入文件名为prepare.in。
第一行,两个整数M,N用空格隔开。后面N行,每行三个整数用空格隔开Ai、Ci、Vi
【输出】
输出文件名为prepare.out。
一个整数,能买的物品的最大价值和
【输入输出样例】
prepare.in prepare.out
40 4 45
1 20 5
2 10 7
3 15 19
4 5 1
[解决办法]
参考
#include <stdio.h>#include <string.h>#include <stdlib.h>#define two(a) (a)*(a) #define max(a,b) (a)<(b)?(b):(a)int value[110],dist[110],cost[110],num[110];int n,k,lim_cost;void zeroonepack(int costt,int valuee){ for(int i=lim_cost;i>=costt;i--) if(dist[i]<dist[i-costt]+valuee) dist[i]=dist[i-costt]+valuee;}int main(){ int i,j,m,l; freopen("prepare.in","r", stdin); freopen("prepare.out", "w", stdout); while(scanf("%d%d",&lim_cost,&m)==2) { memset(dist,0,sizeof(dist)); for(i=1;i<=m;i++) scanf("%d%d%d",&num[i],&cost[i],&value[i]); for(i=1;i<=m;i++) { k=1; while(k<num[i]) { zeroonepack(cost[i]*k,value[i]*k); num[i]-=k; k*=2; } zeroonepack(cost[i]*num[i],value[i]*num[i]); } printf("%d\n",dist[lim_cost]); } return 0;}