标签:ace his ini tar different lin trouble max which
Description
Input
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; }
标签:ace his ini tar different lin trouble max which
原文地址:http://www.cnblogs.com/superxuezhazha/p/6064294.html