资源预览内容
第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
亲,该文档总共4页全部预览完了,如果喜欢就下载吧!
资源描述
0/1 背包问题动态规划详解及背包问题动态规划详解及 C 代码代码动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些结果减轻运算量。比如 01 背包问题。/* 一个旅行者有一个最多能用 M 公斤的背包,现在有 N 件物品,它们的重量分别是 W1,W2,.,Wn,它们的价值分别为 P1,P2,.,Pn.若每种物品只有一件求旅行者能获得最大总价值。输入格式:M,NW1,P1W2,P2.输出格式: X */因为背包最大容量 M 未知。所以,我们的程序要从 1 到 M 一个一个的试。比如,开始任选N 件物品的一个。看对应 M 的背包,能不能放进去,如果能放进去,并且还有多的空间,则,多出来的空间里能放 N-1 物品中的最大价值。怎么能保证总选择是最大价值呢?看下表。测试数据:10,33,44,55,6cij数组保存了 1,2,3 号物品依次选择后的最大价值.这个最大价值是怎么得来的呢?从背包容量为 0 开始,1 号物品先试,0,1,2,的容量都不能放.所以置 0,背包容量为 3 则里面放 4.这样,这一排背包容量为 4,5,6,.10 的时候,最佳方案都是放 4.假如 1 号物品放入背包.则再看 2 号物品.当背包容量为 3 的时候,最佳方案还是上一排的最价方案 c 为 4.而背包容量为 5 的时候,则最佳方案为自己的重量 5.背包容量为7 的时候,很显然是 5 加上一个值了。加谁?很显然是 7-4=3 的时候.上一排 c3 的最佳方案是 4.所以。总的最佳方案是 5+4 为 9.这样.一排一排推下去。最右下放的数据就是最大的价值了。(注意第 3 排的背包容量为 7 的时候,最佳方案不是本身的 6.而是上一排的 9.说明这时候 3 号物品没有被选.选的是 1,2 号物品.所以得 9.)从以上最大价值的构造过程中可以看出。f(n,m)=maxf(n-1,m), f(n-1,m-wn)+P(n,m)这就是书本上写的动态规划方程.这回清楚了吗?下面是实际程序(在下面是实际程序(在 VCVC 6.06.0 环境下通过)环境下通过): :#includeint c10100;/*对应每种情况的最大价值*/int knapsack(int m,int n)int i,j,w10,p10;printf(“请输入每个物品的重量,价值:n“);for(i=1;ici-1j)/*如果本物品的价值加上背包剩下的空间能放的物品的价值*/*大于上一次选择的最佳方案则更新 cij*/cij=pi+ci-1j-wi;elsecij=ci-1j;else cij=ci-1j;return(cnm);int main()int m,n;int i,j;printf(“请输入背包的承重量,物品的总个数:n“);scanf(“%d,%d“,printf(“旅行者背包能装的最大总价值为%d“,knapsack(m,n);printf(“n“);return 0;
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号