30-01背包的最优解

题目内容:
背包最大允许装载为C, 有n个物品要放进背包,每个物品的重量为w[1],w[2],...w[n],每个物品的价值为v[1],v[2],...v[n], 请选择物品装进背包,使得价值最大。C为整数。
输入描述
第一行为物体个数n,以及背包容量C;
第二行为n个重量(实数),空格隔开
第三行为n个价值(实数),空格隔开

输出描述
第一行为最大装载的总价值
第二行为每个物品是否装载,1表示装,0表示不装,中间用空格隔开
(测试数据能保证最优解唯一)

输入样例
5 10
2 2 6 5 4
6 3 5 4 6

输出样例
15
1 1 0 0 1

思路: 为了得到最优解,用了二维数组。
#include <iostream>
#include <cstdio>
using namespace std;
int dp[1000][1000];
int w[1000], v[1000];
int a[1000];
int main(){
	int m, c;
	cin >> m >> c;
	for(int i = 1; i <= m; i++)
		cin >> w[i];	
	for(int i = 1; i <= m; i++)
		cin >> v[i];
	for(int i = 1; i <= m; i++){
		for(int j = 0; j <= c; j++){   //背包可以为0 
			if(i != 1)
				dp[i][j] = dp[i - 1][j];
			if(j >= w[i])
				dp[i][j] = (dp[i][j] > dp[i - 1][j - w[i]] + v[i] ? dp[i][j] : dp[i - 1][j - w[i]] + v[i]);
//			cout << dp[i][j] << " ";
		}
//		cout << endl;
	}	
	cout << dp[m][c] << endl;
	int b = c;
	for(int i = m; i >= 1; i--){
		if(dp[i][b] > dp[i - 1][b]){
			a[i] = 1;
			b -= w[i];
		}	
	}
	for(int i = 1; i <= m; i++)
		cout << a[i] << " ";
	return 0;
}
原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7450403.html