18705 01背包问题
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC;JAVA;PYTHON
Description
有一个容积为M的背包和N件物品。第i件物品的体积W[i],价值是C[i]。求解将哪些物品装入背包可使价值总和最大。每种物品只有一件, 可以选择放或者不放入背包。
输入格式
第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30); 第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
输出格式
一个数,表示最大总价值。
输入样例
10 4 2 1 3 3 4 5 7 9
输出样例
12
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n,r;
cin>>r>>n;
int m[n+1],v[n+1];
for(int i=1;i<=n;i++){
cin>>m[i]>>v[i];
}
vector<vector<int>> dp(n+1,vector<int>(r+1,0));
for(int i=1;i<=n;i++){
for(int j=1;j<=r;j++){
if(m[i]>j){
dp[i][j]=dp[i-1][j];
}
else{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-m[i]]+v[i]);
}
}
}
cout<<dp[n][r];
return 0;
}
/*对应的dp数组情况,不同顺序输入的例子:
4 5
1 2
2 3
2 4
3 5
0 0 0 0 0 0
0 2 2 2 2 2
0 2 3 5 5 5
0 2 4 6 7 9
0 2 4 6 7 9
4 5
2 3
1 2
3 5
2 4
0 0 0 0 0 0
0 0 3 3 3 3
0 2 3 5 5 5
0 2 3 5 7 8
0 2 4 6 7 9
*/
对应的dp数组情况,不同顺序输入的例子:
5 4
1 2
2 3
2 4
3 5
0 0 0 0 0 0
0 2 2 2 2 2
0 2 3 5 5 5
0 2 4 6 7 9
0 2 4 6 7 9
5 4
2 3
1 2
3 5
2 4
0 0 0 0 0 0
0 0 3 3 3 3
0 2 3 5 5 5
0 2 3 5 7 8
0 2 4 6 7 9