首先输入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;
}
}