有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式:
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。0<N,V≤1000
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。0<vi,wi≤1000
输出格式:
输出一个整数,表示最大价值。
输入样例:
4 7
1 2
2 4
3 4
4 5
输出样例:
11
解法归纳:
一、如果装不下当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的。
二、如果装得下当前物品。
假设1:装当前物品,在给当前物品预留了相应空间的情况下,前n-1个物品的最佳组合加上当前物品的价值就是总价值。
假设2:不装当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的。
选取假设1和假设2中价值较大的价值,为当前最佳组合的价值。
#include <bits/stdc++.h>
using namespace std;
const int NUM=1010;
const int CAP=1010;
int vi[NUM];
int wi[CAP];
int p[NUM][CAP];
void knapsack(int n,int m)
{
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
p[i][j]=p[i-1][j];
if(j>=vi[i]){
p[i][j]=max(p[i][j],p[i-1][j-vi[i]]+wi[i]);
}
}
}
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>vi[i]>>wi[i];
}
knapsack(n,m);
cout<<p[n][m]<<endl;
return 0;
}