01背包问题
来源:互联网 发布:mui vue.js 集成 编辑:程序博客网 时间:2024/04/30 00:05
一:问题
有
二:基本思路
这是最基础的背包问题,特点是:每种物品仅有一件。
状态
转移方程
对于第
三:代码
/** * * author 刘毅(Limer) * date 2017-03-17 * mode C++ */#include<iostream>#include<algorithm>using namespace std;int main(){ const int N = 6; //物品个数 const int V = 10; //背包体积 int C[N + 1] = { -1,5,6,5,1,19,7 }; //第i个物品的体积(下标从1开始) int W[N + 1] = { -1,2,3,1,4,6,5 }; //第i个物品的价值 int F[N + 1][V + 1] = { 0 }; //状态 for (int i = 1; i <= N; i++) //对于第i个物品 for (int v = 0; v <= V; v++) { F[i][v] = F[i - 1][v]; //第i个不放 if (v - C[i] >= 0 && F[i][v] < F[i - 1][v - C[i]] + W[i]) //如果比它大,再放第i个 F[i][v] = F[i - 1][v - C[i]] + W[i]; } cout << "最大价值是:" << F[N][V] << endl; //9 return 0;}
四:空间复杂度优化
以上方法的时间和空间复杂度均为
先考虑上面讲的基本思路如何实现,肯定是有一个主循环i ← 1 to N
,每次算出来二维数组
事实上,这要求在每次主循环中我们以v ← V to C[i]
的递减顺序计算
优化后的代码如下:
/** * * author 刘毅(Limer) * data 2017-03-17 * mode C++ */#include<iostream>#include<algorithm>using namespace std;int main(){ const int N = 6; //物品个数 const int V = 10; //背包体积 int C[N + 1] = { -1,5,6,5,1,19,7 }; //第i个物品的体积(下标从1开始) int W[N + 1] = { -1,2,3,1,4,6,5 }; //第i个物品的价值 int F[V + 1] = { 0 }; //状态 for (int i = 1; i <= N; i++) //对于第i个物品 for (int v = V; v >= C[i]; v--) F[v] = max(F[v], F[v - C[i]] + W[i]); cout << "最大价值是:" << F[V] << endl; //9 return 0;}
五:初始化的细节问题
我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。这两种问法的实现方法只是在初始化的时候有所不同。
如果是第一种问法,要求恰好装满背包,那么在初始化时除了F[0]为0,其它F[1]…F[V]均设为−∞,这样就可以保证最终得到的F[V]是一种恰好装满背包的最优解。如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将F[0]…F[V]全部设为0。
这是为什么呢?可以这样理解:初始化的F数组事实上就是在没有任何物品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为0的背包可以在什么也不装且价值为0的情况下被“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,应该被赋值为-∞了。如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个解的价值为0,所以初始时状态的值也就全部为0了。
参考文献:
[ 1 ] .背包九讲.
文章转自我的个人博客:http://www.61mon.com/index.php/archives/188/
- 背包问题---01背包
- DP 背包问题 01背包
- 01背包--苹果,背包问题
- 01背包 完全背包问题
- 背包问题之01背包
- 背包问题之01背包
- 背包问题1:01背包
- 背包问题《1》01背包
- 01背包+完全背包问题
- 背包问题-背包01-苹果
- 背包问题之01背包
- 背包问题(01背包,完全背包,多重背包)
- 背包问题(01背包,完全背包,多重背包)
- 动态规划-----背包问题-----01背包,完全背包,多重背包
- 经典背包问题 01背包+完全背包+多重背包
- 背包(01背包、完全背包、多重背包)问题总结
- 背包问题(01背包,完全背包,多重背包)
- 经典背包问题 01背包+完全背包+多重背包
- iOS 数组的去重(普通的无序的去重和排序好的去重)
- HttpClient
- 浅谈方正教务模拟登录实现
- 多线程编程
- SlideCloseLayout—仿头条多图预览的页面关闭效果
- 01背包问题
- 363. Max Sum of Rectangle No Larger Than K
- Malaysia Online Casino RM30 Free 50(30 free 50, deposit promotion, free bonus, malaysia online casin
- Java: Integer.toBinaryString(int i) 方法翻译详解
- smtp邮件服务 ipv6 高级网络配置
- [Wondgirl] iOS数组排序
- 1380 没有上司的舞会 树形dp
- 门禁系统
- HWSoft命令使用说明(一)---专业图库