标签:tar read ... for family dfs namespace i++ panel
描述
给定整数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 }
标签:tar read ... for family dfs namespace i++ panel
原文地址:https://www.cnblogs.com/qq-1585047819/p/10858670.html