2 10 1 20 1 3 10 1 20 2 30 1 -1
20 10 40 40题目大意将一堆有价值的东西按照价值分成两份,尽量保证两者价值相等,如果不行则第一份的价值要大于第二份。东西不可切割。解题思路这道题咋看有点复杂,其实也只是换了一种思维,因为题目要求要尽量平均分配,所以我们可以先将总价值sum求出,然后得出其分配的平均值为sum/2,要注意这个答案可能为小数,但是又因为sum是整数,所以最后得出的sum/2是要小于等于实际的值。将这个结果进行01,背包,可以得出其中一个宿舍所得的最大价值,而另一个宿舍的最大价值也可以相应的得到,而前者必定小于等于后者。代码#include<stdio.h> #include<string.h> #include<algorithm>//1 using namespace std;//2 int w[5200]; int dp[252000]; //n=50,m=100,w=50,dp=n*m*w; int main() { int n; int m,a,b,sum; int i,j,k; while(scanf("%d",&n)&&n>=0) { m=0; sum=0; for(i=0;i<n;i++) { scanf("%d%d",&a,&b); while(b--) { w[m]=a; m++; sum+=a; } } memset(dp,0,sizeof(dp)); for(i=0;i<m;i++) for(j=sum/2;j>=w[i];j--)//平均值为sum/2,要注意这个答案可能为小数, //但是又因为sum是整数,所以最后得出的sum/2是要小于等于实际的值。 dp[j]=max(dp[j],dp[j-w[i]]+w[i]); //用max()的时候得用1+2 printf("%d %d\n",sum-dp[sum/2],dp[sum/2]); } return 0; }
1411211846-hd-Big Event in HDU
原文:http://blog.csdn.net/wangluoershixiong/article/details/41360965