首先输入n表示有n个数
再将n个数存入数组中
输入一个k表示n个数中可以累和出k
分析:
每个数都有两种状态加入累和与不加入累和
#include <iostream> using namespace std ; const int MAX_N = 1000 ; int a[MAX_N] ; bool visited[MAX_N] ; //用于记录是否会把第i个数加入累和 int n , k; bool dfs(int i , int sum) // 对第i个数 sun:到第i-1个数的累和 { if(i == n) return sum == k; //一个分支搜索结束 if(dfs(i+1 , sum)) //表示不加上第i个数 { visited[i] = false ; return true ; } if(dfs(i+1 , sum + a[i])) //表示加上第i个数 { visited[i]=true ; return true ; } return false ; } int main() { cin >> n ; memset(visited,0 ,sizeof(visited)) ; for(int i = 0 ; i < n ; i++) { cin >> a[i] ; } cin >> k ; if(dfs(0 , 0)) { cout << "YES\n" ; for(int i = 0 ; i < n ; i++) { if(visited[i]) cout << a[i] << " " ; } cout << endl ; } else { cout << "NO\n" ; } return 0; }
先加
#include <iostream> using namespace std; const int MAX_N = 100000; int a[MAX_N]; bool visit[MAX_N]; int n; int k; int sum; bool ok; void dfs(int pas); int main() { while(cin >> n) { ok = false; for(int i = 0; i < n; i++) cin >> a[i]; cin >> k; memset(visit, false, sizeof(visit)); sum = 0; dfs(0); if(!ok) cout << "No\n"; } return 0; } void dfs(int pas) { if(sum >= k) { if(sum == k) { if(!ok) { cout << "Yes" << endl; ok = true; } for(int i = 0; i < n; i++) { if(visit[i]) cout << a[i] << ' '; } cout << endl; } return; } for(int i = pas; i < n; i++) { sum += a[i]; visit[i] = true; dfs(i + 1); sum -= a[i]; visit[i] = false; } }
扫描二维码关注公众号,回复:
909401 查看本文章