#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
int a[4] = {0,1,2,3};
while(next_permutation(a,a+4)){
for(int i = 0;i<4;i++){
printf("%d",a[i]);
if(i == 3) printf("\n");
}
}
}
然后你自己挑前几位。能不能凑成你的券。自己玩吧。
代码如下:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int mod=1e5+7;
vector<int> hash[mod+2];
int money[75];
int n,m;
bool flag;
void dfs(int v,int mm)
{
if(mm==m) {flag=true;return;}
int m1=(mm%mod+mod)%mod;
hash[m1].push_back(mm);
if(v==n/2)
return;
if(mm+money[v+1]<=m)
dfs(v+1,mm+money[v+1]);
dfs(v+1,mm);
}
bool dfs2(int v,int mm)
{
if(v==n+1) return false;
int m1=((m-mm)%mod+mod)%mod;
int ss=hash[m1].size();
for(int i=0;i<ss;i++)
{
if(mm+hash[m1][i]==m)
return true;
}
bool ac;
if(mm+money[v+1]<=m)
{
ac=dfs2(v+1,mm+money[v+1]);
if(ac) return true;
}
ac=dfs2(v+1,mm);
if(ac) return true;
return false;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
flag=false;
for(int i=0;i<=mod+1;i++)
hash[i].clear();
for(int i=1;i<=n;i++)
scanf("%d",&money[i]);
dfs(0,0);
if(flag==true)
{printf("YES\n");continue;}
if(dfs2(n/2,0))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}