标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 4039 Accepted Submission(s):
1677
因为如果一个物品是5 9,一个物品是5 6,对第一个进行背包的时候只有dp[9],dp[10],…,dp[m],再对第二个进行背包的时候,如果是普通的,应该会借用前面的dp[8],dp[7]之类的,但是现在这些值都是0,所以会导致结果出错。于是要想到只有后面要用的值前面都可以得到,那么才不会出错。设A:p1,q1 B:p2,q2,如果先A后B,则至少需要p1+q2的容量,如果先B后A,至少需要p2+q1的容量,那么就是p1+q2 > p2+q1,变形之后就是q1-p1 < q2-p2。
所以要针对每个属性的q-p来进行排序
题意:每个物品有p、q、v,三个属性,每个物品的话费为p,但是前提是必须有q,v则是得到的价值。
附上代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 struct node 7 { 8 int p,q,v; 9 } ss[505]; 10 11 int maxs(int a,int b) 12 { 13 return a>b?a:b; 14 } 15 bool cmp(node a,node b) 16 { 17 return a.q-a.p<b.q-b.p; //关键排序,详见上文分析 18 } 19 int main() 20 { 21 int n,m,i,j; 22 int dp[5005]; 23 while(~scanf("%d%d",&n,&m)) 24 { 25 for(i=0; i<n; i++) 26 scanf("%d%d%d",&ss[i].p,&ss[i].q,&ss[i].v); 27 sort(ss,ss+n,cmp); 28 memset(dp,0,sizeof(dp)); 29 for(i=0; i<n; i++) 30 for(j=m; j>=ss[i].q; j--) 31 dp[j]=maxs(dp[j],dp[j-ss[i].p]+ss[i].v); 32 printf("%d\n",dp[m]); 33 } 34 return 0; 35 }
hdu 3466 Proud Merchants(有排序的01背包)
标签:
原文地址:http://www.cnblogs.com/pshw/p/5042472.html