4959: 部分和问题

描述

给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。

输入

输入数据有多组,每组第一行为两个整数n和k,n表示数的个数,k表示数的和。
第二行为n个数。

1<=n<=20,-10^8<=ai, k<=10^8

输出

如果和恰好可以为k,输出“Yes”,否则“No”

样例输入

样例输出

解题思路:dfs

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll arr[25],sum=0;
 5 ll n,k,flag;
 6 
 7 bool cmp(int a,int b){
 8     return a<b;
 9 }
10 
11 void dfs(int rankk){
12     if(sum>k) return;
13     else if(sum==k) {flag=1;return;}
14     for(int i=rankk;i<=n;i++){
15         sum+=arr[i];
16         dfs(i+1);
17         sum-=arr[i];
18     }
19 }
20 
21 int main()
22 {
23     ios::sync_with_stdio(false);
24     while(cin>>n>>k){
25         for(int i=1;i<=n;i++){
26             cin>>arr[i];
27         }
28         sort(arr+1,arr+1+n,cmp);
29         for(int i=1;i<=n;i++){
30             sum=0;flag=0;
31             dfs(i);
32             if(flag==1) break;
33         }
34         if(flag==1) cout << "Yes" << endl;
35         else cout << "No" << endl;
36     }
37     return 0;
38 }
View Code

 

猜你喜欢

转载自www.cnblogs.com/qq-1585047819/p/10858670.html