数据结构算法设计——动态规划——01背包问题(二维数组)

问题描述

题目来源:<精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课>

小明有一个容量为 V 的背包。

这天他去商场购物,商场一共有 N 件物品,第 i 件物品的体积为 w_i,价值为 v_i

小明想知道在购买的物品总体积不超过 V 的情况下所能获得的最大价值为多少,请你帮他算算。

输入描述

输入第 1 行包含两个正整数 N,V 表示商场物品的数量和小明的背包容量。

第 2∼N+1 行包含 2 个正整数 w,v 表示物品的体积和价值。

1≤N≤10^21≤V≤10^31≤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]); 理解了这一点,这道题就很容易了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值