The partial sum problem
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
One day,Tom’s girlfriend give him an array A which contains N integers and asked him:Can you choose some integers from the N integers and the sum of them is equal to K.
-
输入
-
There are multiple test cases.
Each test case contains three lines.The first line is an integer N(1≤N≤20),represents the array contains N integers. The second line contains N integers,the ith integer represents A[i](-10^8≤A[i]≤10^8).The third line contains an integer K(-10^8≤K≤10^8).
输出
- If Tom can choose some integers from the array and their them is K,printf ”Of course,I can!”; other printf ”Sorry,I can’t!”. 样例输入
-
4 1 2 4 7 13 4 1 2 4 7 15
样例输出
-
Of course,I can! Sorry,I can't!
部分和问题,使用DFS求解 ,与NYOJ 1058一样
一:
参见《挑战程序设计竞赛》 #include <iostream> #include <cstring> using namespace std; int n, k; int a[25], b[25]; //已经从前i项得到了和sum,然后对于i项之后的进行分支 bool dfs(int i, int sum) { //如果前i项都计算过了,则返回sum是否与k相等 if (i == n) return sum == k; // b[i] = 0; //不加上a[i]的情况 if (dfs(i + 1, sum)) return true; //b[i] = 1; //加上a[i]的情况 if (dfs(i + 1, sum + a[i])) return true; //无论是否加上a[i]都不能凑成k就返回false return false; } int main() { while (cin >> n){ for (int i = 0; i < n; i++) cin >> a[i]; cin >> k; if (dfs(0, 0)){ cout << "Of course,I can!" << endl; //for (int i = 0; i < n; i++){ //if (b[i]) // cout << a[i] << " "; } //cout << endl; } else cout << "Sorry,I can't!" << endl; } return 0; }
二:#include <iostream> using namespace std; typedef long long ll; int n, k; ll a[25]; ll sum; int flag; void dfs(int x) { if (sum > k) return; if (sum == k) flag = 1; for (int i = x; i < n; i++){ sum += a[i]; dfs(i + 1); sum -= a[i]; } } int main() { while (cin >> n){ sum = 0, flag = 0; for (int i = 0; i < n; i++) cin >> a[i]; cin >> k; dfs(0); if (flag) cout << "Of course,I can!" << endl; else cout << "Sorry,I can't!" << endl; } }
-
There are multiple test cases.