0-1背包——动态规划

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