题目描述如下:
给n个糖果 ,每个糖1或2克,问能否将n个糖果平均分成重量相同的两份
一开始想着算出总重量sum,看sum是否为偶数即可,但是对于2 2 2的数据会卡,然后又想如果n为偶数且sum为偶数即可,但1 1 2的n不是偶数,但也可以平均分
对于模拟暂时找不到规律的题,就开始想算法了,看见标签中有dp,想试试dp写法,但是dp是求某个集合中的最优解,而不是判断状态,无从下手(有大佬会拿这个写dp的话给个链接让我学习下 )
重新找规律,那就分类讨论,一个个情况分别判断
当n为偶数时,只有当1的个数为偶数时才能(一定能)平均分,否则一定会有1剩下,这个情况很简单
当n为奇数时,看1的个数,1为偶数时,2为奇数,让2少的一边分两个1,即判断1的个数减2是否仍大于零;1为奇数时,2为偶数,一定不能平均分
将上述if else 模拟成代码得到ac代码
代码如下:
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
int a[110];
int dp[110];
void solve(){
int x=0,y=0;
int n;cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]==1) x++;
else y++;
}
//偶数次输入,1的个数是偶数,则一定能分成两份相同大小
if(n%2==0){
if(x%2!=0){
cout<<"NO"<<endl;
return;
}else{
cout<<"YES"<<endl;
return;
}
}
//奇数次输入,若2的个数为偶数,一定不行 ,若2的个数为奇数,(x-2)需要非负(一定是偶数)
if(n%2==1){
if(y%2==0){
cout<<"NO"<<endl;
return;
} else if(y%2==1){
if(((x-2)>=0){
cout<<"YES"<<endl;
return;
}else{
cout<<"NO"<<endl;
return;
}
}
}
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}