Description
The splitting is absolutely a big event in HDU! At the same time, it is a trouble thing too. All facilities must go halves. First, all facilities are assessed, and two facilities are thought to be same if they have the same value. It is assumed that there is N (0<N<1000) kinds of facilities (different value, different kinds).
Input
A test case starting with a negative integer terminates input and this test case is not to be processed.
Output
Sample Input
2 10 1 20 1 3 10 1 20 2 30 1 -1
Sample Output
20 10 40 40
好久不刷题了,看到这个题一点思路也没有。后来想了一下,其实不难。把一组数,分解为和尽量相等的2组数。
看作01背包问题,背包容量为sum/2,求怎么组合可以最大可能的接近sum/2.
#include<iostream> #include<stdio.h> #include<math.h> #include<string.h> using namespace std; int val[50*100+5]; int dp[250005]; int max(int a,int b) { if(a>=b) return a; else return b; } int main() { int n; while(~scanf("%d",&n)&&n>0) { memset(dp,0,sizeof(dp)); int sum=0; int num=0; for(int i=0;i<n;i++) { int tmp1,tmp2; scanf("%d%d",&tmp1,&tmp2); while(tmp2>0) { val[num++]=tmp1; sum+=tmp1; tmp2--; } } for(int i=0;i<num;i++) { for(int j=sum/2;j>=val[i];j--) { dp[j]=max(dp[j-val[i]]+val[i],dp[j]); } } printf("%d %d\n",sum-dp[sum/2],dp[sum/2]); } return 0; }