19185 01背包问题
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: 不限定
Description
一个旅行者有一个最多能装 M公斤的背包,现在有 n件物品,它们的重量分别是W1,W2,...,。 它们的价值分别为C1,C2,...,,求旅行者在不超过背包重量M的情况下,能获得最大总价值。 PS:01背包问题也能用于个人的时间管理,如何分配时间在不同的任务上,才能最大化提升个人价值。
输入格式
第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30); 第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
输出格式
一个数,表示最大总价值。
输入样例
10 4 2 1 3 3 4 5 7 9
输出样例
12
提示
通过的同学可以查看标程,提供了二维数组和一位数组两种写法。
作者
30002692
解题思路
采用二维数组dp[i][j]表示前i个物品中重量不超过j的最大价值,dp[n][m]就是我们需要求解的结果。
代码如下
#include <iostream>
#include <cmath>
using namespace std;
int w[201]; // 重量
int v[201]; // 价值
int dp[32][201]; // dp[i][j]示从前i个物品中选,选出的总体积小于j的最优解
int main()
{
int m, n; //背包容量,物品数量
cin >> m >> n;
int i, j;
for(i=1;i<=n;i++)
cin >> w[i] >> v[i];
for(i=0;i<=m;i++)
dp[0][i] = 0;
// 前i个物品
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if (w[i] > j)
dp[i][j] = dp[i-1][j]; // 大于当前背包容量
else
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]); // 是否选第i个物品
}
}
cout << dp[n][m] << endl;
return 0;
}