0-1背包——动态规划
其他
2018-11-05 16:11:17
阅读次数: 0
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;
}
转载自blog.csdn.net/u013747658/article/details/51502301