ピーターとその友人たちは休暇中なので、
スペイン北部を知るために車で旅行することにしました。彼らは7人で、荷物は2台の車で十分だと思います。
出発する時間です。。。スーツケースの山が車から待っています。ドライバーは
、1つのブーツ
が他のブーツよりも重い重量を運ぶことを望んでいないため、各ブーツにどのスーツケースを入れる必要があるかについて意見が異なります。2つのブーツが同じ重量でロードすることは可能ですか?(明らかに
スーツケースを開梱せずに!)
スーツケースの重量を表すmセットの数を検討します。
スーツケースをブーツに分配することが可能で、2つのブーツの重量が同じである場合、それぞれについて決定する必要があります。
入力
入力の最初の行には、テストケースの数を示す整数mが含まれています。
テストケースごとに、1つのスペースで区切られたn個の整数(1≤n≤20)を含む行があります。
これらの整数は、各スーツケースの重みです。すべてのスーツケースの重量の合計は
200キログラム以下です。
出力
出力はm行で構成されます。i番目の行は、i番目のスーツケースの重みのセットに対応し
、2つのブーツ
がそれぞれのテストケースに対して同じ重みでロードされる可能性に応じて、文字列「YES」または「NO」を含みます。
サンプル入力
3
1 2 1 2 1
2 3 4 1 2 5 10 50 3 50
3 5 2 7 1 7 5 2 8 9 1 25 15 8 3 1 38 45 8 1
サンプル出力
いいえ
はい
はい
質問:一連の数字を与え、この数字のセットを2つの等しい部分に分割できるかどうか尋ねます
アイデア:配列を並べ替え、2つのグループを最大から最小に追加します。追加したグループの数が少ない場合は、追加後に2つのグループが等しい場合は実行できますが、それ以外の場合は実行できません。(注:入力時に各グループの数は指定されていません。この記事の入力方法は比較的単純だと思います)
ACコード:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int a[10010];
int main()
{
int n;
char ch;
cin>>n;
while(n--)
{
int tot=0;
while (~scanf("%d%c",&a[tot],&ch)&&ch==' ')
tot++;
sort(a,a+tot+1);
int l=0,r=0;
for(int i=tot;i>=0;i--)
{
if(l<=r)
{
l+=a[i];
continue;
}
if(l>r)
r+=a[i];
}
if(l==r)
printf("YES\n");
else
printf("NO\n");
}
}