题目链接:
https://www.dotcpp.com/oj/problem1432.html
题目大意:
给你一个n*m个数字,让你判断其中是否能分成两部分和相等,可以就输出包含左上角的数字的这部分的数的个数,不能分成两部分相等则输出0。
如:n=3,m=3,
10 1 52
20 30 1
1 2 3
就可以分成如下的红色和黄色两部分,
两边的部分的单个和都为60,所以就输出包含左上角的部分的个数,即10,20,30,总共有三个。
故输出3.
思路:
首先我们可以想一下,如果所有的数之和为奇数,那么在所有数都是整数的情况下必然是不可能存在两边数之和相等的情况的。
然后再往后看,我们其实就是相当于是找包含左上角的数,往后面找看是不是能找到,总共数之和的一半,能找到就用变量将这个数字记录下来,继续往后找,如果找到后面有包含更少的数字的情况就能达到这个和,就将这个数字的个数替换之前的那个记录了数字个数的变量值即可。
ac代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int num[105];
int sum;
int number;//记录能组合出来两边相等的数字的个数
int solve(int a,int max,int count){
int ans;
if(num[a] == max){
if(count > number){
number = count;
}
return 0;
}
for(int i = a+1;i < n*m;i++){
count++;
ans = num[a] + solve(i,max-num[a],count);
count--;
}
return 0;
}
int main(){
cin>>n>>m;
sum = 0;
for(int i = 0;i < n*m;i++){
cin >> num[i];
sum += num[i];
}
if(sum%2 == 1){//如果为和为奇数,那么分为两部分的和无论如何都无法相等
cout<<"0"<<endl;
return 0;
}
number = 0;
solve(0,sum/2,1);
cout<<number<<endl;
return 0;
}