01背包问题【动态规划】
2014-06-24 15:21
417 查看
问题:
假设有n个物品,每个物品都是有重量的,同时每个物品也是有价值的,要求把这些物品放到一个背包中,这个背包的载重量是有限制的,怎么使得背包里面的物品总价值最大?
符号表示:
N:物品个数
W:背包载重量
w[i]:物品i的重量(1<i<=N)
v[i]:物品i的价值(1<i<=N)
c[i, j]:到物品i为止,背包重量限制为j的最优解(1<i<=N, 1<j<=W)
分析:
最优解结构:对于物品i,只有两种情况,放入或不放入。假设物品i放入了是最优解的一部分,那么我们这时候拿掉物品i,c[i-1, j-w[i]]也应该是最优解
递归定义最优解的值:
![](http://img.blog.csdn.net/20140623172029968?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1MTA2NDc4Mjk4Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
按自底向上的方式计算最优值:双重循环,i从1到N循环,j从1到W循环
由计算出的结果构造一个最优解:自顶向下,i从N到1循环,如果c[i,j]>c[i-1,j],则物品i放入背包,否则反之。
代码(c++):
输入的测试数据可以参考:http://zhidao.baidu.com/question/77646243.html
假设有n个物品,每个物品都是有重量的,同时每个物品也是有价值的,要求把这些物品放到一个背包中,这个背包的载重量是有限制的,怎么使得背包里面的物品总价值最大?
符号表示:
N:物品个数
W:背包载重量
w[i]:物品i的重量(1<i<=N)
v[i]:物品i的价值(1<i<=N)
c[i, j]:到物品i为止,背包重量限制为j的最优解(1<i<=N, 1<j<=W)
分析:
最优解结构:对于物品i,只有两种情况,放入或不放入。假设物品i放入了是最优解的一部分,那么我们这时候拿掉物品i,c[i-1, j-w[i]]也应该是最优解
递归定义最优解的值:
按自底向上的方式计算最优值:双重循环,i从1到N循环,j从1到W循环
由计算出的结果构造一个最优解:自顶向下,i从N到1循环,如果c[i,j]>c[i-1,j],则物品i放入背包,否则反之。
代码(c++):
#ifndef ___1package__package__ #define ___1package__package__ #include <iostream> #include <string> #include <vector> using namespace std; class Package{ public: void init(string dataSource); void print(); private: void compute(); int m_nN; // The number of object int m_nW; // The max weight of package vector<int> m_vecWeight; // The weight of object vector<int> m_vecValue; // The value of object vector<vector<int> > m_vecMatrix; // The results matrix }; #endif /* defined(___1package__package__) */
// // package.cpp // 01package #include "package.h" #include <fstream> void Package::init(string dataSource){ // read data from datasource ifstream file; file.open(dataSource); if (file.is_open()){ string buffer; file>>m_nW; file>>m_nN; m_vecWeight.clear(); m_vecWeight.push_back(0); m_vecValue.clear(); m_vecValue.push_back(0); int w, v; for (int i=0; i<m_nN; ++i) { file>>w>>v; m_vecWeight.push_back(w); m_vecValue.push_back(v); } while(!file.eof()){ file>>buffer; cout<<buffer<<endl; } } file.close(); m_vecMatrix.clear(); // set first row and first column to zero for (int i=0; i<=m_nN; ++i) { m_vecMatrix.push_back(vector<int>(m_nW+1, 0)); } } void Package::print(){ compute(); cout<<"\n=====The Results======\n"<<"The max value: "<<m_vecMatrix[m_nN][m_nW]<<endl; } void Package::compute(){ for (int i=1; i<=m_nN; ++i) { for (int j=1; j<=m_nW; ++j) { int cur_weight = m_vecWeight[i]; if (cur_weight>j) { m_vecMatrix[i][j] = m_vecMatrix[i-1][j]; } else{ m_vecMatrix[i][j] = max<int>(m_vecMatrix[i-1][j-cur_weight]+m_vecValue[i], m_vecMatrix[i-1][j]); } } } }
输入的测试数据可以参考:http://zhidao.baidu.com/question/77646243.html
相关文章推荐
- 动态规划求解01背包相关的基本问题
- 动态规划:01背包问题的浅谈
- 动态规划——背包问题1:01背包
- 01背包问题回溯法和动态规划
- 实际问题的算法抽象——动态规划中的01背包问题
- 01背包问题 动态规划解法
- 动态规划三部曲之01背包问题的分析和实现(二)
- 夕拾算法进阶篇:18)装箱问题 (01背包_动态规划DP)
- 集合问题 动态规划 01背包
- 动态规划 4、基础背包问题总结(从01开始)
- c语言数据结构:01背包问题-------动态规划
- 01背包问题python(使用递归和动态规划)
- 夕拾算法进阶篇:17)01背包和完全背包问题 (动态规划DP)
- 01背包问题(动态规划)
- 01背包问题 动态规划 c语言实现
- 01背包问题---动态规划详解
- 01 背包问题 动态规划
- 01背包问题 动态规划
- (1)01背包问题____动态规划
- 01背包问题--动态规划