- 题目描述
小明有一个容量为V的背包。这天他去商场购物,商场一共有N 件物品,第i件物品的体积为
Wi,价值为Vi。报告小明想知道在购买的物品总体积不超过V的情况下所能获得的最大价值为多少,请你帮他算算。
- 输入描述
输入第1行包含两个正整数N,V,表示商场物品的数量和小明的背包容量。第2~N+1行包含2个正整数w,v,表示物品的体积和价值。(1<N<100,1<V<1000 1<Wi,Vi<1000)
- 输出描述
输出一行整数表示小明所能获得的最大价值。
- 解题思路
1.采用动态规划(dp)的思想,设置dp[i][j]数组:在j容量下 第1-i件物品中能获得最大价值
2.如果在j的容量下,第i件物品放不下,所以第1-i件物品中能获得的最大价值等于第1-(i-1)件物品中能获得的最大价值:dp[i][j]=dp[i-1][j];
3.else:第1-i件物品中能获得的最大价值=MAX(第1-(i-1)件物品中能获得的最大价值,第1-(i-1)件物品中能获得最大价值的基础上拿了第i件物品的情况):dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])
4.输出dp[N][V],在V容量下 第1-N件物品中能获得最大价值
- 代码模拟实现
#include<bits/stdc++.h>
using namespace std;
int dp[1000][9000];//dp[i][j] 在j容量下 第1-i件物品中能获得最大价值
int w[1000];//因为1<N<1000
int v[1000];
int main()
{
int N,V;
cin>>N>>V;//输入物品的数量和小明背包的容量
for(int i=1;i<=N;i++)
{
cin>>w[i];//物品的体积
cin>>v[i];//物品的价值
}
dp[0][0]=0;//初始化为0,因为在容量0的情况下能获得的价值肯定为0
for(int i=1;i<=N;i++)//第一件到第N件物品
{
for(int j=0;j<=V;j++)//容量从0到V
{
if(j<w[i])//背包容量j小于第i件物品的容量
{
dp[i][j]=dp[i-1][j];//因为空间不够,没有把第i件物品放到包里,第1-i件物品中能获得的最大价值=第1-(i-1)件物品中能获得的最大价值
}
else{ //没拿第i件物品 //拿了第i件物品
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);//第1-i件物品中能获得的最大价值=MAX(第1-(i-1)件物品中能获得的最大价值,第1-(i-1)件物品中能获得最大价值的基础上拿了第i件物品的情况)
}
}
}
cout<<dp[N][V];//在V容量下 第1-N件物品中能获得最大价值
return 0;
}
- 测试运行结果