dfs:部分和问题
给定整数a1, a2 … an,判断是否从中可以选出若干数,使他们的和恰好为k
注意:
每个数只能选择一次,当然也可以不选
// CreateTime: 2015-04-07 22:55:39 #include <iostream> using namespace std; int n; int a[100005]; int k; int ok; void dfs(int step, int sum) { if (n == step) { if (sum == k) { ok = 1; } return; } dfs(step+1, sum); dfs(step+1, sum+a[step]); } int main(void) { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } cin >> k; ok = 0; dfs(0, 0); if (ok) { cout << "Yes" << endl; } else { cout << "No" << endl; } return 0; } // 4 1 2 4 7 13 // 4 1 2 4 7 15
还可以写的更美观点
// CreateTime: 2015-04-07 22:55:39 #include <iostream> using namespace std; int n; int a[100005]; int k; int ok; int dfs(int step, int sum) { if (n == step) { if (sum == k) { return 1; } else { return 0; } } if(dfs(step+1, sum)) { return 1; } if(dfs(step+1, sum+a[step])) { return 1; } } int main(void) { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } cin >> k; ok = 0; if(dfs(0, 0)) { cout << "Yes" << endl; } else { cout << "No" << endl; } return 0; } // 4 1 2 4 7 13 // 4 1 2 4 7 15