您的位置:首页 > 编程语言 > PHP开发

uvalive 6303 Smartphone Manufacturing

2015-03-20 23:41 134 查看
思路:类似背包,直接搞

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#include<queue>
#include<cstring>
#include<set>
#include<stack>
#include<string>
#include<ctime>
#define LL long long
#define u64 unsigned long long
#define maxn 100010
#define INF 0x3f3f3f3f
#define eps 1e-6
using namespace std;

int a[1010];
bool vi[500010] ;
vector<int>q;
set<int>ss;
void solve(int n)
{
memset(vi,0,sizeof(vi)) ;
vi[0]=true;
int v,Max=0;
for( int i = 1 ; i <= n ;i++){
for(int j = Max ; j >= 0 ;j--)if(vi[j])
{
vi[j+a[i]]=true;
}
Max+=a[i];
}
}
int main()
{
int L,n,m,ans1,ans2,sum,a1,a2 ;
int i,j,k,T ;
cin >> T ;
while(T--)
{
scanf("%d",&n) ;
sum=0;
for( i = 1 ; i <= n ;i++ ){
scanf("%d",&a[i]) ;
sum += a[i] ;
}
solve(n) ;
m = sum/2;
for( i = m ; i >= 0 ;i--)if(vi[i])
break ;
ans1=i ;
ans2=sum-i;
k=0;

sum=0;
scanf("%d",&n) ;
for( i = 1 ; i <= n ;i++ ){
scanf("%d",&a[i]) ;
sum += a[i] ;
}
solve(n) ;
m = sum/2;
for( i = m ; i >= 0 ;i--)if(vi[i])
break ;
a1=i ;
a2=sum-i;

if(a2-a1 < ans2-ans1 || (a2-a1==ans2-ans1&&a1+a2 >ans2+ans1) )
{
ans1=a1;
ans2=a2;
k = 1;
}

sum=0;
scanf("%d",&n) ;
for( i = 1 ; i <= n ;i++ ){
scanf("%d",&a[i]) ;
sum += a[i] ;
}
solve(n) ;
m = sum/2;
for( i = m ; i >= 0 ;i--)if(vi[i])
break ;
a1=i ;
a2=sum-i;

if(a2-a1 < ans2-ans1 || (a2-a1==ans2-ans1&&a1+a2 >ans2+ans1) )
{
ans1=a1;
ans2=a2;
k = 2;
}
printf("%c %d %d\n",'A'+k,ans1,ans2) ;
}
return 0 ;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: