首页 > 其他 > 详细

01背包问题

时间:2019-02-05 11:31:39      阅读:249      评论:0      收藏:0      [点我收藏+]

01背包问题(价值)

例题https://www.luogu.org/problemnew/show/P1048        最基本的背包,没有拐弯  

注意点:

  1. 二维dp数组是dp[i+1][w+1],后面那个千万别开小了  

  2. 背包大小为0,或者物品大小为0时,价值全部为0。因此两个for全部初始化为0!

  3. 还原最优解物品组合要标记

  

cin>>W>>N;
   FOR(i,1,N)
   {
      cin>>a[i].wei>>a[i].val;
   }
   FOR(i,1,N)
   {
      dp[i][0]=0;
   }
   FOR(i,1,W)
   {
      dp[0][i]=0;
   }
   FOR(i,1,N)
      FOR(j,1,W)
      {
         /*if(a[i].wei>j)
         {
            dp[i][j]=dp[i-1][j];
         }
         else
         {
            dp[i][j]=max(dp[i-1][j-a[i].wei]+a[i].val,dp[i-1][j]);
         }*/
         dp[i][j] = dp[i-1][j];
         if(a[i].wei>j)
            continue;
         if(a[i].val+dp[i-1][j-a[i].wei]>dp[i-1][j])
            dp[i][j] = a[i].val+dp[i-1][j-a[i].wei];
      }
   cout<<dp[N][W];
3:for(int i=N,w=W;i>=1;i--)
      {
         if(G[i][w]==diagonal)
         {
            cout<<i<<endl;
            w-=a[i].wei;
         }
      }

补充另一个背包问题,填充型背包

https://www.luogu.org/problemnew/show/P1049  没拐弯

cin>>M>>N;
   FOR(i,1,N)
   {
      cin>>v[i];
   }
   for(int i=1;i<=N;++i)
      for(int j=M;j>=v[i];--j)
   {
      f[j]=max(f[j],f[j-v[i]]+v[i]);
   }
   cout<<M-f[M];

 

01背包问题

原文:https://www.cnblogs.com/jrfr/p/10352579.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!