金额查错---1.dfs来模拟过程,记忆化无法剪枝 2.set来记录情况 3.巧妙return俩更新
·
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define N 100003
#define pi 3.1415926535
typedef pair<int,pair<int,int>> piii;
typedef pair<ll,int> pii;
int an,n;
int a[105];
bool bo[105];
int sum[105];
set<vector<int>> ann;
void dfs(int pos)
{
if(sum[pos]<an||an<0) return;
if(an==0)
{
int f=1;
vector<int> x;
for(int i=0;i<n;i++)
{
if(!bo[i]) x.push_back({a[i]});
}
ann.insert(x);
return;
}
dfs(pos+1);
an-=a[pos];
bo[pos]=1;
dfs(pos+1);
an+=a[pos];
bo[pos]=0;
}
void solve()
{
cin>>an;cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);for(int i=n-1;i>=0;i--) sum[i]=sum[i+1]+a[i];
dfs(0);
for(auto i:ann)
{
for(auto j:i)
{
cout<<j<<" ";
}
cout<<endl;
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}
更多推荐


所有评论(0)