小明有一个容量为 V 的背包。
这天他去商场购物,商场一共有 N种物品,第 i 种物品的体积为 wi,价值为 vi,每种物品都有无限多个。
小明想知道在购买的物品总体积不超过 V 的情况下所能获得的最大价值为多少,请你帮他算算。
输入第 1行包含两个正整数 N,V,表示商场物品的数量和小明的背包容量。
输入样列:
5 20
1 6
2 5
3 8
5 15
3 3
/*小明有一个容量为V的背包。
这天他去商场购物,商场一共有 N 种物品,第 i 种物品的体积为 w
,价值为
,每种物品都有无限多个。
小明想知道在购买的物品总体积不超过 V 的情况下所能获得的最大价值为多少,请你帮他算算。*/
#include <iostream>
using namespace std;
const int maxn = 1000+10;
int n,m;//n 物品数量 m背包总量
int weight[maxn];//每一种物品的重量
int value[maxn];//每一种物品的价值
int dp[maxn][maxn];
int d[maxn];
/**
* 输入数据
*/
void input(){
cin >> n>>m;
for (int i = 1; i <= n ; ++i) {
cin >> weight[i]>>value[i];
}
}
/**
* 使用二维数组存放状态转移数组
* @return 最大的价值
*/
int dp1(){
int maxx = 0;
for (int i = 1; i <=n ; ++i) {
for (int j = 0; j <=m; ++j) {
if(j < weight[i]){
dp[i][j]=dp[i-1][j];
} else{
dp[i][j] = max(dp[i-1][j],dp[i][j-weight[i]]+value[i]);
}
maxx = max(maxx,dp[i][j]);
}
}
return maxx;
}
/**
* 使用一维数组存放
* @return 最大的价值
*/
int dp2(){
int maxx = 0;
for (int i = 1; i <=m ; ++i) {
for (int j = weight[i]; j <=m;j++) {
d[j]= max(d[j],d[j-weight[i]]+value[i]);
maxx = max(maxx,d[j]);
}
}
return maxx;
}
int main() {
input();
cout<<dp1()<<"\n";
return 0;
}