问题描述
题目来源:<精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课>
小明有一个容量为 V 的背包。
这天他去商场购物,商场一共有 N 件物品,第 i 件物品的体积为 w_i,价值为 v_i。
小明想知道在购买的物品总体积不超过 V 的情况下所能获得的最大价值为多少,请你帮他算算。
输入描述
输入第 1 行包含两个正整数 N,V 表示商场物品的数量和小明的背包容量。
第 2∼N+1 行包含 2 个正整数 w,v 表示物品的体积和价值。
1≤N≤10^2,1≤V≤10^3,1≤wi,vi≤10^3。
输出描述
输出一行整数表示小明所能获得的最大价值。
解题代码
#include <iostream>
using namespace std;
const int maxn=1005;
int w[maxn]={0};//每一个物品的体积
int v[maxn]={0};//每一个物品的价值
int dp[maxn][maxn]={0};
int main()
{
// 请在此输入您的代码
int N,V;
cin>>N>>V;
for(int i=1;i<=N;i++){
cin>>w[i]>>v[i];
}
for(int i=1;i<=N;i++){
for(int j=1;j<=V;j++){
if(w[i]>j){
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][V];
return 0;
}
解题思路
首先,题目要求“最大价值”,要考虑到用动态规划解题。
动态规划解题最重要的步骤就是找到状态转移方程。对于这个题而言,前i个物品,j个空位所能组成的最大价值分两种情况:
1.如果第i个物品放不进来,那就跟前 i-1 个物品,j 个空位所能组成的最大价值相等。
2.如果第i个物品能放进来,那前 i 个物品,j 个空位能组成的最大价值就要么是“前 i-1 个物品,j个空位能组成的最大价值”,要么是“前 i-1 个物品,预留出最后一个物品的空位的前提下,加上第 i 个物品的价值”,也就是“要么放,要么不放”。
因此我们很容易得到它的状态转移方程为 dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]); 理解了这一点,这道题就很容易了。