现在有N个取值在1~5000的整数序列,现在我任意给出一个数X,求出在N个数列中和为X的所有组合。
比如:
N=10个数列:1 2 3 3 9 5 100 50 30 15
X=10
比如:
N=10个数列:1 2 3 3 9 5 100 50 30 15
X=10
满足条件的组合:A、2 3 5 B、1 9
这是一个典型的 Sub-set-Sum问题,NP-C问题,这里没有高效的解法,暂时只想到了暴力DFS。如果不输出解的话可以考虑动态规划。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int maxn=5000;
bool vis[maxn];
int xn[maxn],hash[maxn];
int n,sum,cnt;
vector<int> ans;
void dfs()
{
if(cnt==sum){
for(int i=0;i<ans.size();i++){cout<<ans[i]<<" ";hash[ans[i]]=1;}
cout<<endl;
}
else if(cnt>sum)return ;
for(int i=0;i<n;i++)
{
if(vis[i])continue;
if(hash[xn[i]])continue;
if(xn[i]>sum)return ;
cnt+=xn[i];
vis[i]=1;
ans.push_back(xn[i]);
//cout<<"ans.push_back :"<<xn[i]<<endl;
dfs();
vis[i]=0;
ans.pop_back();
cnt-=xn[i];
//cout<<"ans.pop_back :"<<xn[i]<<endl;
}
}
int main()
{
sum=10;
cin>>n;
for(int i=0;i<n;i++)cin>>xn[i];
sort(xn,xn+n);
memset(vis,0,sizeof(vis));
memset(hash,0,sizeof(hash));
cnt=0;
dfs();
return 0;
}