在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数)。求背包能够容纳的最大价值。
Input
第1行,2个整数,N和W中间用空格隔开。N为物品的数量,W为背包的容量。(1 <= N <= 100,1 <= W <= 10000) 第2 - N + 1行,每行2个整数,Wi和Pi,分别是物品的体积和物品的价值。(1 <= Wi, Pi <= 10000)
Output
输出可以容纳的最大价值。
Input示例
3 6 2 5 3 8 4 9
Output示例
14
01背包,就是有n个物品,每个物品有体积,有价格,
有一个固定体积的背包,
求这个背包装的物品的最大价格。
#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> using namespace std; const int MAX_N = 100 + 5; //物品最大的个数 const int MAX_V = 10000 + 5; //背包最大的体积 int dp[MAX_N + 1][MAX_V + 1]; int n,bagV; //n个物品,背包的体积是bagV int v[MAX_N],p[MAX_N]; //第i个物品(从0开始)的体积和价格 void solve() { for(int i = 0;i < n;i ++) //每次只考虑前i个物品 { for(int j = 0;j <= bagV;j ++) //用 j 体积的背包去装前i个物品, { if(j < v[i]) // 如果第i个物品的体积太大,大于背包的体积 j,那么这个物品一定不装进去, dp[i + 1][j] = dp[i][j]; //此时和背包体积为j时装 (i-1)个物品的价格相同。 else //如果第i个物品可以装进去,比较放入和不放入两种情况 dp[i + 1][j] = max(dp[i][j],dp[i][j - v[i]] + p[i]); // dp[i][j - v[i]] + p[i] 放入,所以要留出v[i]的体积,
} //dp[i][j - v[i]] + p[i] 背包还有v[i],体积时装(i - 1)个物品的最大价值,再加上第i个物品的价值p[i], } printf("%d\n",dp[n][bagV]); }int main(){ cin>>n>>bagV; for(int i = 0;i < n;i ++) cin>>v[i]>>p[i]; solve(); return 0;}