- #include <bits/stdc++.h>
- using namespace std;
- const int N = 10005;
- int a[N], n, m, rec[N];
- bool nu;
- void dfs(int start, int sum, int cnt) {
- if (sum > m) return;//剪枝
- if (sum == m) {
- //for (int i = 0; i < cnt; i++)
- //cout << rec[i] << " ";
- nu = true;//記錄是否找到一组解
- cout<< 1 <<endl;
- return;
- }
- for (int i = start; i < n; i++) { //重覆性剪枝
- rec[cnt] = a[i]; //記錄當前選的值
- //cout<<rec[cnt]<<"#";
- dfs(i + 1, sum + a[i], cnt + 1); //對下一個進行搜索
- if (nu)
- return;
- }
- }
- int main() {
- cin >> n ;//n個砝碼
- for (int i = 0; i < n; i++) {
- cin >> a[i];//a 陣列裡放n個砝碼
- m +=a[i];//砝碼重量加總
- }
- if(m%2==1)//總重量若為奇數,不可能出現平衡的狀態
- cout<<0;
- m/=2;//若要天秤平衡,必須找到一個子集合的和正好是加總的一半
- dfs(0, 0, 0);//start,sum,cnt
- if (!nu)
- cout << 0 << endl;
- return 0;
- }
複製代碼 |