ZCMU-1133

image
image

emm就直接看的前辈的了。


#include <stdio.h>
#include <string.h>
#include <algorithm>
//我不成熟的想法是两成遍历
//但感觉会时间超限,但没有先想到深度搜索 
using namespace std;
int n,t;
int num[101];
//存放输入情况 
int r[101];
//记录可能情况 
bool flag;
void dfs(int len,int k,int last)
{
    int result;
    if(last==0){
        flag=false;
        for(int i=0;i<len;i++)
        if(i==0)printf("%d",r[i]);
        else printf("+%d",r[i]);
        printf("\n");
        return ;
    }
    for(int i=k;i<n;i++){
           
        if(i==k||num[i]!=num[i-1]&&last-num[i]>=0)// 去除重复的操作
        {
          //这里的i==k或者后面情况是
          //为了保证遇到前后相同时,自身不会被重用
          //并且还能使用后面的情况 
          r[len]=num[i];
          dfs(len+1,i+1,last-num[i]);
        }      
    }
}
int main()
{
    while(scanf("%d%d",&t,&n)!=EOF)
    {
        memset(r,0,sizeof(r));
        memset(num,0,sizeof(num));
        if(t==n&&n==0)break;
        flag=true;
        for(int i=0;i<n;i++)
        scanf("%d",&num[i]);
        printf("Sums of %d:\n", t);
        dfs(0,0,t);
        if(flag)printf("NONE\n");
    }
    return 0; 
}
posted @ 2024-06-03 13:20  海&贼  阅读(22)  评论(0)    收藏  举报