基准时间限制:1 秒 空间限制:131072 KB 分值: 20
难度:3级算法题
给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K。如果可以,输出:"Yes",否则输出"No"。
Input
第1行:2个数N, K, N为数组的长度, K为需要判断的和(2 <= N <= 20,1 <= K <= 10^9) 第2 - N + 1行:每行1个数,对应数组的元素A[i] (1 <= A[i] <= 10^6)
Output
如果可以,输出:"Yes",否则输出"No"。
Input示例
5 13 2 4 6 8 10
Output示例
No
解法可以说很多了 本质大同小异
1. 枚举法
#include <iostream> using namespace std; typedef long long ll; const int MAXN = 2e6; int arr[MAXN]; int brr[MAXN]; int main() { int n, ans, flag = 1, len; cin>>n>>ans; for(int i = 0; i < n; i++) { cin>>arr[i]; len = flag; for(int j = 0; j < len; j++) { if(arr[i] + brr[j] == ans) { cout<<"Yes"<<endl; return 0; } else if(arr[i] + brr[j] < ans) { brr[flag ++ ]= arr[i] + brr[j]; } } /*for(int j = 0; j < flag; j++) cout<<brr[j]<<' '; cout<<endl;*/ } cout<<"No"<<endl; return 0; }
2.dfs
#include <iostream> using namespace std; int a[110]; int n, ans; int flag = false; void dfs(int nowsum, int pos) { if(nowsum > ans) return ; if(nowsum == ans) { flag = true; return ; } for(int i = pos + 1; i <= n && !flag; i++) { dfs(nowsum + a[i], i); } } int main() { cin>>n>>ans; for(int i = 1; i <= n; i++) cin>>a[i]; dfs(0,0); if(flag) cout<<"Yes"<<endl; else cout<<"No"<<endl; return 0; }