51Nod 1085 背包问题 【dp】
在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数)。求背包能够容纳的最大价值。
输入
第1行,2个整数,N和W中间用空格隔开。N为物品的数量,W为背包的容量。(1 <= N <= 100,1 <= W <= 10000)
第2 - N + 1行,每行2个整数,Wi和Pi,分别是物品的体积和物品的价值。(1 <= Wi, Pi <= 10000)
输出
输出可以容纳的最大价值。
输入样例
3 6
2 5
3 8
4 9
输出样例
14
应该掌握的经典dp问题
状态转移方程 dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])
#include<iostream>
#include<cmath>
using namespace std;
const int N = 100+5;
int w[N];
int v[N];
int dp[N][N*N];
int main()
{
int n,package;
scanf("%d%d",&n,&package);
for(int i = 1; i <= n ;i++){
scanf("%d%d",&w[i],&v[i]);
}
for(int i = 1; i <= n ;i++){
for(int j = 0; j <= package;j++){
if(j>=w[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
else
dp[i][j]=dp[i-1][j];
}
}
printf("%d\n",dp[n][package]);
return 0;
}