【动态规划】采药

匿名 (未验证) 提交于 2019-12-02 23:49:02

原题传送门

˼·


设dp[i][j]为前i个物体装入容量为j的背包的最大价值,w[i],v[i]分别为第i个物品的重量和价格。
那么dp[n][W]即为所求。(n为个数,W为容量)。

分两种情况:
不装入,那么dp[i][j]就等于dp[i-1][j]。
装入,那么dp[i][j]就等于dp[i-1][j-w[i]]+v[i]。

若容量j<w[i],则无法装,只能选择情况1。
否则取两种情况中价值最大者。

故状态转移方程为:

dp[i][j]=dp[i-1][j]                               (j<w[i]) dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+v[i]}     (j≥w[i])

剩下的就是小菜一碟的Code了。

Code


//经典背包,无需解释  #include<iostream> #include<cstdio> #include<cmath>  using namespace std;  int T,M,w[101],v[101],dp[101][1001];  int main() {     //初始化      for(int i=1;i<=M;i++)     {         dp[i][0]=0;     }     for(int i=1;i<=T;i++)     {         dp[0][i]=0;     }          //读入      scanf("%d%d",&T,&M);     for(int i=1;i<=M;i++)     {         scanf("%d%d",&w[i],&v[i]);     }          //装叉走起     for(int i=1;i<=M;i++)     {         for(int j=1;j<=T;j++)         {             if(j<w[i])             {                 dp[i][j]=dp[i-1][j];             }             else             {                 dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);             }         }      }          //输出     printf("%d",dp[M][T]);          return 0; }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!