动态规划——01背包问题

写在前面:做题博客仅为思路描述自己使用,想到哪写哪。

  • 题目:

有 N件物品和一个容量是 V的背包。每件物品只能使用一次(01背包)。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

  • 分析:

     选定状态数组:dp[i][j]定义为前i个物品在背包总体积为j时的最优装载方法。 填dp因为有top_down和bottom_up,所以要按顺序填进去,后面来的dp一定是前面的dp计算而来的,所以

   状态转移方程 :要考虑目前的剩余体积能否装得下第i个物品,分类讨论。

  1.     若j>vi 即当前的背包容量(背包总容量而不是剩余体积)可以装得下第i个物品:此时有装 与不装两个选择,若当前物品不装,则dp[i][j]=dp[i-1][j],若当前物品要装入,dp[i][j]=dp[i-1][j-v[i]]+w[i], 取两次的最大值作为选择方案。
  2. 若j

  •     代码:        

 

#include
using namespace std;
const int N=1010;
int v[N];
int w[N];
int dp[N][N];//通常为了不使用动态数组,就设定一个大数组
int main()
{
    int n,m;
//基本输入与dp数组的初始化:
    cin>>n>>m;
    for(int i=1;i>w[i]>>v[i];
    }
    for(int i=0;i

dp[i][j]=dp[i-1][j-vi]+wi  体现出最优子结构,上一个物体、总体积恰好为j-vi时的最大价值再加上这个物体(第i个)的价值恰好就是第i个物体,总体积为j的总价值。

你可能感兴趣的:(动态规划,算法)