背包问题代码

来源:互联网 发布:慕课网 java视频教材 编辑:程序博客网 时间:2024/04/30 18:04
#include <iostream>using namespace std;int f[1000];const int N = 5;//物品的种类int volume[N];//每种物品所占有的空间int val[N];//每种物品的价值int maxVol;void MultiplePack(int volm,int val,int count)//第i种物品的数量为count;{if(volm * count >=maxVol){CompletePack(volm,val);return;}int k = 1;while (k<count)//将count个的第i物品分成n份,每份的数量按照1,2^1,2^2,2^3,...,count - 2^i +1,如此将每份都看成不同的物品,份数相加能表示任何小于等于count的整数{ZeroOnePack(k*volm,k*val);count = count - k;k = 2*k;}ZeroOnePack(count*volm,count*val);}void ZeroOnePack(int volm,int val)//设此次处理的是第i中物品,则此函数求出的是在每种容量下,从第0到第i种物品的最优组合,使其价值最高(已知从第0到第i-1的最优组合,此函数的作用只是对每一种容量下判断是否添加第i中物品){for (int v = maxVol;v>=volm;--v){f[v] = max(f[v],f[v-volm] + val);//max括号里面的f都是指在从第0到第i-1种物品最优组合。当处理第一个物品时,因为f被初始化为0,所以这一步也等价于初始化f,即在小于等于maxVol的情况下,最大值都是第一个物品的价值}}void CompletePack(int volm,int val)//不管在v-volm容量下是否已经添加第i种物品了,这个函数只需判断是v-volm容量下添加第i种物品的价值和在v容量下从第0到第i-1物品的价值{for (int v=volm;v<=maxVol;++v){f[v] = max(f[v],f[v-volm] + val);}}int main(){memset(f,0,sizeof(f));for (int i = 0;i<N;++i){ZeroOnePack(volume[i],val[i]);}return 0;}

原创粉丝点击