51nod 1268 和为K的组合
基准时间限制: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
搜索+回溯
#include <cstring> #include <cstdio> bool vis[22],flag; int N,K,A[22]; void dfs(long long sum,int pos) { if(sum>K) return; if(flag) return; if(sum==K) {flag=1;return;} for(int i=pos+1;i<=N;i++) { if(!vis[i]) { vis[i]=1; dfs((long long)sum+A[i],i); vis[i]=0; } } } int main() { scanf("%d%d",&N,&K); for(int i=1;i<=N;i++) scanf("%d",&A[i]); for(int i=1;i<=N;i++) { memset(vis,0,sizeof(vis)); vis[i]=1; dfs((long long)A[i],i); vis[i]=0; if(flag) {printf("Yes");return 0;} } printf("No"); return 0; }
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。