01背包的c语言实现
2014-10-23 21:19
260 查看
01背包算是动态规划的入门项目了,网上的解释也是各种烂大街。题目基本是下面这种格式的:
01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2……Wn,与之相对应的价值为P1,P2……Pn。(来自百度百科)
恩,就是这样,第一眼看上去完全没有头绪,不过别害怕,这绝对不是你见到的第一个DP问题。生活中的每一个问题都有动态规划融入其中,你能活到现在,说明你有能力处理好这些问题。
现在我们来想一想,生活中如何解决这种问题。我们假设背包有W + 1个状态(0,1,2,...,W)。状态从0开始,每次放入新的物品背包的总价值都会增大,可放物体的体积都会缩小,到这里大家都应该没有问题吧。
然后我们再考虑“将前i件物品放入容量为v的背包中”这个子问题,如果只考虑放不放第i件物品,那么这个问题就可以转化为一个只牵扯前i-1件物品的问题:
如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[v];
如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c的背包中”,此时能获得的最大价值就是f[v-c]。
再加上通过放入第i件物品获得的价值 W[i],我们就可以从后向前地得出在前M件物品中取出若干件放进背包能获得的最大价值了。
下面是用C语言实现的代码:
代码整体算是比较简洁的了,主要注意一下 F[ j ] = max( F[ j ] , F[ j - c[ i ] ] + w[ i ] )这个状态转移方程,一定要彻底明白方程的意思,刚开始的时候背下来也可以......
恩,差不多了,题目虽然简单,但重要的是思想,掌握好了基础的,才能继续前行嘛~
01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2……Wn,与之相对应的价值为P1,P2……Pn。(来自百度百科)
恩,就是这样,第一眼看上去完全没有头绪,不过别害怕,这绝对不是你见到的第一个DP问题。生活中的每一个问题都有动态规划融入其中,你能活到现在,说明你有能力处理好这些问题。
现在我们来想一想,生活中如何解决这种问题。我们假设背包有W + 1个状态(0,1,2,...,W)。状态从0开始,每次放入新的物品背包的总价值都会增大,可放物体的体积都会缩小,到这里大家都应该没有问题吧。
然后我们再考虑“将前i件物品放入容量为v的背包中”这个子问题,如果只考虑放不放第i件物品,那么这个问题就可以转化为一个只牵扯前i-1件物品的问题:
如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[v];
如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c的背包中”,此时能获得的最大价值就是f[v-c]。
再加上通过放入第i件物品获得的价值 W[i],我们就可以从后向前地得出在前M件物品中取出若干件放进背包能获得的最大价值了。
下面是用C语言实现的代码:
#include <iostream> using namespace std; int main() { int V,N; int i,j; int c ; int w ; cin >> V >> N; for(i = 1;i <= N;i++) { cin >> c[i] >> w[i]; } int F[10010] = {}; for(i = 1;i <= N;i++) { for(j = V;j >= c[i];j--) { F[j] = max(F[j],F[j - c[i]] + w[i]); } } cout << F[V]; return 0; }
代码整体算是比较简洁的了,主要注意一下 F[ j ] = max( F[ j ] , F[ j - c[ i ] ] + w[ i ] )这个状态转移方程,一定要彻底明白方程的意思,刚开始的时候背下来也可以......
恩,差不多了,题目虽然简单,但重要的是思想,掌握好了基础的,才能继续前行嘛~
相关文章推荐
- 01背包问题(用c语言实现)-回溯法求解
- DP实例之01背包问题C语言实现
- 01背包问题 动态规划 c语言实现
- 背包问题的C语言实现
- 0-1背包和背包问题(C语言实现)——贪心算法应用(3)
- 背包问题-C语言实现
- C语言实现单链表-01版
- 一维数组实现01背包
- 01背包的回溯方法实现(JAVA版本)
- POJ3624(01背包:滚动 实现)
- 01背包问题的java界面实现
- 01背包问题的java界面实现
- merker—hellman背包加密的C语言简单实现
- 01背包的改进实现
- 01背包和完全背包 的完整讲解版 包含 一维数组实现 和二维数组实现题目
- 01背包问题概述及实现(有改动)
- 01背包的简单实现(C++)
- 01背包问题 及c++ 代码实现
- 01背包问题-状态d[i][j],f[i][j],滚动数组--java实现
- 【C语言/算法之 01 背包】完全背包