首页 > 其他 > 详细

5483: 神奇的背包(带有限制的01背包)

时间:2019-11-26 18:28:17      阅读:97      评论:0      收藏:0      [点我收藏+]

5483: 神奇的背包 技术分享图片

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: 197            测试通过:28

描述

 

 

现有一个神奇的背包,它的容量为n,它还有个另外一个属性m,也是它的神奇之处,即当它的剩余容量大于等于m时,可以装任意一个体积的物品,求最大能装多少价值的物品?

 

 

输入

 

首先输入n,m,t (0<=n,m,t<=1000),接下来是t行,每行两个整数w,v(0<=w,v<=1000000)分别代表体积和价值。

 

输出

 

输出最大能装多少价值,测试实例输出占一行。

 

样例输入

样例输出

 8

技术分享图片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,m,t,maxx;
 5 int dp[1005],dpp[1005];
 6 struct Node{
 7     int w,v;
 8 }A[1005];
 9 
10 bool cmp(Node a,Node b){
11     if(a.v!=b.v) return a.v>b.v;   //先按照价值排序
12     return a.w>b.w;  //在按照重量
13 }
14 
15 int main()
16 {
17     ios::sync_with_stdio(false);
18     cin>>n>>m>>t;
19     for(int i=1,d1,d2;i<=t;i++){
20         cin>>d1>>d2;
21         A[i]={d1,d2};
22     }
23     sort(A+1,A+1+t,cmp);
24     for(int i=1;i<=t;i++){
25         if(i!=1){
26             for(int k=n-m;k>=A[i].w;k--){   //预存出m的空间  拿来放最大的价值
27                 dpp[k]=max(dpp[k],dpp[k-A[i].w]+A[i].v);
28             }
29         }
30         for(int k=n;k>=A[i].w;k--){
31             dp[k]=max(dp[k],dp[k-A[i].w]+A[i].v);
32         }
33     }
34     for(int i=1;i<=n-m;i++) dpp[i]+=A[1].v;  //放入
35     int res=0;
36     for(int i=1;i<=n;i++){
37         int maxx;
38         maxx=max(dp[i],dpp[i]);  //两者进行比较
39         res=max(res,maxx);
40     }
41     cout << res << endl;
42     return 0;
43 }
View Code

 

5483: 神奇的背包(带有限制的01背包)

原文:https://www.cnblogs.com/qq-1585047819/p/11937332.html

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