5483: 神奇的背包(带有限制的01背包)
5483: 神奇的背包
时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte
总提交: 197 测试通过:28
View Code
总提交: 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 }