如何把背包问题转化成动态规划 01背包 彻底背包 多重背包

如何把背包问题转化成动态规划

绪言

每当有人看到这样的题目:数组

有n 种物品(各有一件/都有无限件/有有限件),它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具备最大的价值总和?spa

那我的可能会喊道:code

个人妈呀。。。又是背包【哭】blog

今天我必定要搞懂背包!input

这我的,是你,也(就)是我。(dalao们好!)io

01背包

这是最基础的背包问题class

咱们不妨从输入讲起基础

input

能够用结构体structobject

struct str{ int w; int v; } object[n];

也能够用数组di

int v[n],w[n];

为表达方便,如下代码使用数组

solution

这里用一种我从未见过的表达方式:

  用dp[i][j]表示以j为剩余容量,选择性的放入前i个物品的最大价值。

初始化:

  dp[0][j]=dp[i][0]=0;

进入下一步的选择:

  对于每个物品,你有两个选择:

    容量不足,装不下它:

      此时的价值==前i-1个物品时的价值,即dp[i][j]=dp[i-1][j]

    容量足以装下它,but不必定能达到当前最优价:

      在选与不选中选择一个最优的,即dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+v[i]};

      其中dp[i-1][j]为不装状况,dp[i-1][j-w[i]]+v[i]为装的状况

这就是递推式了

dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+v[i]};

Code

相关文章
相关标签/搜索