121 分糖果

121 分糖果

作者: xxx 时间限制: 10S 章节: 一维数组

问题描述 :

肖恩和帕特里克是兄弟,他们从他们的父母那里得到了很多糖果。每一块糖具有一个正整数的价值,孩子们希望分他们得到的糖果。首先,肖恩将这些糖果分成两堆,并选择一堆给帕特里克。然后,帕特里克将尝试计算每堆的价值,其中每堆的价值是那堆糖果价值的总和,如果他觉得没有平等的价值,他将开始哭了起来。

不幸的是,帕特里克太小了,所以不能正确的计算。他只会二进制无进位的加法。比如说,他想算12(二进制为1100)加5(二进制为101),他会把最右边的两位加法算正确,但是第三位会忘记进位。(即0+0=0,0+1=1,1+0=1,1+1=0)

因此,帕特里克算12加5的结果为9。下面几个是帕特里克算的结果:

5 + 4 = 1

7 + 9 = 14

50 + 10 = 56

肖恩数学很好,他想得到价值总和更高的糖果并且不让他的弟弟哭。如果可能,他会分成两个非空的糖果袋,让帕特里克认为,双方都有相同的值的糖果。给你每一袋糖果每一块糖果的价值,我们想知道是否可能让帕特里克相信他们得到糖果价值的总量是相同的。如果可能计算出肖恩能得到的最大的价值。

输入说明 :

第一行输入T(1<T<10),表示接下来输入T组测试数据。

每组测试数据占一行,每行包含以下数据,N C1 C2 .. Cn(其中N(2 ≤ N ≤ 10)代表从父母那里得到糖果的总数,C(1 ≤ Ci ≤ 100)代表每块糖果的价值)

输出说明 :

若不能输出NO,若能则输出肖恩得到的最大的价值。

#include<stdio.h>
#include<string.h>
int T,n;
int sum,flag,max;
int Cis[10],C[10];
bool isOk(){
	int tmp1=0,tmp2=0;
	for(int i=0;i<n;i++){
		if(Cis[i]==1)tmp1=tmp1^C[i];//弟弟帕特里克的运算即为异或运算
		else tmp2=tmp2^C[i];
	}
	if(tmp1==tmp2)return true;
	else return false;
}
void dfs(int sum_S,int count){
	if(count>=n){//要保证两个糖果袋子非空
		return;
	}
	if(sum_S>=sum/2&&count<n){
		if(isOk()){
		   flag=1;
		   if(max<sum_S)max=sum_S;
		}
	}
	for(int i=0;i<n;i++){
		if(Cis[i]==0){
			Cis[i]=1;
			sum_S+=C[i];
			dfs(sum_S,count+1);
			sum_S-=C[i];
			Cis[i]=0;
		}
	}
}
int main(){
	scanf("%d",&T);
	while(T--){
		sum=0;flag=0;max=-1;
		memset(Cis,0,sizeof(Cis));
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf("%d",&C[i]);
			sum+=C[i];
		}
		dfs(0,0);
		if(flag==0)printf("NO\n");
		else printf("%d\n",max);
	}
	return 0;
}

2
5 1 2 4 5 8
3 3 5 6

输出范例 :

NO
11

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值