01背包问题——经典DP问题,优化与未优化
2017-09-12 10:41
330 查看
#include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { int n,m; vector<int> w(n),v(n); for (int i=0;i<n;i++) cin>>w[i]>>v[i]; //v为容量数组,W为价值数组,m为总容量 //优化的01背包问题,使用一维数组进行存储。递推公式 //f[i][v] = max{f[i−1][v],f[i−1][v − c[i]]} //变成 f[v]=max{f[v],f[v-c[i]]+w[i]} //注意二层循环从后往前。 vector<int> f(m+1); for (int i = 0; i < n; i++) for (int j = m; j >= w[i]; j--){ f[j] = max(f[j], f[j - w[i]] + v[i]); } cout<<f[m]<<endl; //未优化的01背包问题,这里使用的是二维数组 //递推公式:f[i][v] = max{f[i−1][v],f[i−1][v − c[i]]} //注意因为需要使用f[i-1]的值,因此二维数组一定是n+1*m+1的大小!!! //此时为了方便,w,n数组尽量也需要n+1. //如果w,v是给定的,建议使用上面的优化算法,或者记得循环时候i-1. vector<int> w(n+1),v(n+1); vector<vector<int>> f(n+1,vector<int>(m+1)); for (int i=1;i<=n;i++) cin>>w[i]>>v[i]; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++){ if(j>=w[i]){ f[i][j] = max(f[i-1][j], f[i-1][j - w[i]] + v[i]); } else f[i][j] = f[i-1][j]; } cout<<f [m]<<endl; return 0; }
相关文章推荐
- dp 背包问题01的优化
- 经典问题之01背包
- 数据结构经典算法学习之01背包问题
- BZOJ3163&Codevs1886: [Heoi2013]Eden的新背包问题[分治优化dp]
- 01背包问题,是用来介绍动态规划算法最经典的例子
- DP优化--背包问题
- 动态规划7:砝码和种类优化成01背包问题
- DP背包问题小结(01背包,完全背包,需恰好装满或不需,一维DP、二维DP)
- hdu 1574 RP问题 dp 01背包
- 01背包问题及空间优化
- poj2063 & hdu1963 Investment 又是DP啦,,经典完全背包问题
- 0-1背包问题入门小结 动态规划(DP)经典题目 POJ324 POJ1276
- 01背包问题 第一次DP
- 0-1背包问题入门小结 动态规划(DP)经典题目 POJ324 POJ1276
- 01背包问题的一般DP求解
- poj1276 多重背包问题 转换为经典的01背包
- 0-1背包(DP经典问题)
- 动态规划经典:01背包问题
- 01背包问题 总结关于为什么01背包优化成1维数组后,内层循环是逆序的?
- 01背包问题,dp和贪心解法(c++11)