生日 就是ZOJ的那个题目

img

用全排序暴搜阿。
全排序用例。

#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;
}

img