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

5483: 神奇的背包 分享至QQ空间

时间限制(普通/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

猜你喜欢

转载自www.cnblogs.com/qq-1585047819/p/11937332.html