0-1背包——动态规划

来源:互联网 发布:淘宝app订单页面 编辑:程序博客网 时间:2024/05/17 04:19

0-1背包——动态规划



#include<iostream>#include<vector>#include<iomanip>#include<algorithm>using namespace std;class KnapBack{public :KnapBack(){cin >> n>>c;W.assign(n + 1, 0);P.assign(n + 1, 0);X.assign(n + 1, 0);for (int i = 1; i <= n; i++){int in;cin >> in;W[i] = in;}for (int i = 1; i <= n; i++){int in;cin >> in;P[i] = in;}vector<int> im;M.push_back(im);for (int i = 1; i <= n; i++){vector<int> im1(c+1, 0);M.push_back(im1);}}void Knapsack(){for (int j = 1; j <= c; j++){if (j >= W[n]){M[n][j] = P[n];}else{M[n][j] = 0;}}for (int i = n-1; i >= 1; i--){for (int j = 1; j <= c; j++){if (j >= W[i])//能装{M[i][j] = max(M[i+1][j] , M[i+1][j-W[i]] + P[i]);}else{M[i][j] = M[i + 1][j];}}}}void TraceBack(int i, int j)//构造最优解{if (i < n){if (j >= W[i]){if (M[i][j] == M[i + 1][j - W[i]] + P[i]){X[i] = 1;TraceBack(i + 1, j - W[i]);}else{X[i] = 0;TraceBack(i + 1, j);}}else{X[i] = 0;TraceBack(i + 1, j);}}if (i == n){if (j >= W[i]){X[i] = 1;}else{X[i] = 0;}}}void print(){cout << "OutPut :" << endl;for (int i = 1; i <= n; i++){cout << setw(4) << W[i] << " ";}cout << endl;for (int i = 1; i <= n; i++){cout << setw(4) << P[i] << " ";}cout << endl;for (int i = 1; i <= n; i++){for (int j = 1; j <= c; j++){cout << setw(4) << M[i][j] << " ";}cout << endl;}cout << endl;TraceBack(1 , c);cout << "Schedule : ";for (int i = 1; i <= n; i++){cout << setw(4) << X[i] << " ";}cout << endl;}public:vector<int> W;//各物品重量vector<int> P;//各物品价格vector<vector<int> > M;//最大价值int n;//物品数量int c;//背包容量vector<int> X;//装入方案};KnapBack KB;int main(){KB.Knapsack();KB.print();return 0;}


0 0