首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

多重背包有关问题 求代码

2012-05-01 
多重背包问题 求代码。现在你有M元钱,可以采购N种物品,每种物品最多可以购买Ai件(也可以不购买),每购买一件

多重背包问题 求代码

现在你有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

[解决办法]
参考

C/C++ code
#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;} 

热点排行