L3-1. 凑零钱 PAT团体设计天梯赛

题目 https://www.patest.cn/contests/gplt/L3-1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,a[100000];
int temp[100000];
int tt=0,ttt=0;

int dfs(int sum,int t,int re)
{
    if(sum>m){
        return -1;
    }
    if(sum==m){
        return 1;
    }
    if(a[t]>m){
        return -1;
    }
    re-=a[t];
    for(int i=t+1;i<n;i++){
        if(sum+a[i]>m){
            return -1;
        }
        if(sum+a[i]==m){
            temp[ttt++]=a[i];
            return 1;
        }
       if(re+sum<=m){///注意!!!!!!没找到反例!!!///剪枝!!但剩下的不足时没有必要继续搜了
            return -1;
        }
        int flag=dfs(a[i]+sum,i,re);
        if(flag==1){
                temp[ttt++]=a[i];
                return 1;
        }
    }
    return -1;
}

int main()
{
    scanf("%d%d",&n,&m);
    int s=0;
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        s+=a[i];
    }
    memset(temp,0,sizeof(temp));
    sort(a,a+n);
    for(int i=0;i<n;i++){
        if(dfs(a[i],i,s)==1){
            temp[ttt++]=a[i];
            printf("%d",temp[ttt-1]);
            for(int i=ttt-2;i>=0;i--){
                printf(" %d",temp[i]);
           }
          break;
        }
    }
    if(!ttt&&m!=0){
        printf("No Solution\n");
    }
/*
    else{
        for(int i=0;i<ttt;i++){
            printf("%d ",temp[i]);
        }
    }
*/
}

你可能感兴趣的:(L3-1. 凑零钱 PAT团体设计天梯赛)