在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背包。
模板一:
#include <iostream> using namespace std; const int MAX = 10001; int N, W; int dp[101][MAX]; int w[101]; int v[101]; int main() { cin>>N>>W; for (int i = 1; i <= N; ++i) { cin>>w[i]>>v[i]; } for (int i = 1; i <= N; ++i) { for (int j = 0; j <= W ; ++j) { if (j - w[i] < 0) { dp[i][j] = dp[i - 1][j]; } else { dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]); } } } cout<<dp[N][W]<<endl; return 0; }
模板二:
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { int N, M; cin>>N>>M; int need[503], value[503]; for (int i = 0; i < N; i++) { cin>>need[i]>>value[i]; } int dp[100010]; memset(dp, 0, sizeof(dp)); for (int i = 0; i < N; i++) { for (int j = M; j >= need[i]; j--) { dp[j] = max(dp[j], dp[j - need[i]] + value[i]); } } cout<<dp[M]<<endl; return 0; }