#include<iostream>
using namespace std;
int n, c;
int w[101], v[1001], V[101][1001],isChoose[101];
void FindMax()//动态规划
{
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= c; j++)
{
if (j<w[i])
{
V[i][j] = V[i - 1][j];
}
else
{
if (V[i - 1][j]>V[i - 1][j - w[i]] + v[i])
{
V[i][j] = V[i - 1][j];
}
else
{
V[i][j] = V[i - 1][j - w[i]] + v[i];
}
}
}
}
}
void FindWhat(int i, int j)//寻找解的组成方式
{
if (i >= 0)
{
if (V[i][j] == V[i - 1][j])
{
isChoose[i] = 0;
FindWhat(i - 1, j);
}
else if (j - w[i] >= 0 && V[i][j] == V[i - 1][j - w[i]] + v[i])
{
isChoose[i] = 1;
FindWhat(i - 1, j - w[i]);
}
}
}
int main()
{
cin >> c >> n;
for (int i = 1; i <= n; i++)
{
cin >> w[i] >> v[i];
}
FindMax();
FindWhat(n, c);
for (int i = 1; i <= n; i++)
{
cout << isChoose[i];
}
cout << endl;
cout << V[n][c] << endl;
system("pause");
return 0;
}
01背包问题
最新推荐文章于 2020-05-04 21:50:54 发布