POJ1564 深搜 xingxing在努力

  这道题乍一看是一道搜索题, 不过他的答案输出的确让人很烦, 幸好发现改变搜索的顺序可以很完美的求出来。。下面附上代码:

 

  

#include <cstring>
#include <cstdio>
#include <algorithm>


using namespace std;
int t, n;
int a[1000 + 10];
int num[20];    //最多二十个数
int kind;

int zishi[15];
int cnt ;

void dfs(int dept, int tmp, int sum)   //深度为dept, sum记录tmp元素的个数
{
    if(tmp == t)    //找到了一个答案
    {
        cnt++;
        for(int i=0; i<dept; i++)
        {
            for(int j=0; j<zishi[i]; j++)
            {
                sum--;
                printf("%d%c", num[i], sum==0?'\n':'+');
            }
        }
        return ;
    }
    if(dept >= kind) return ;

    for(int i=a[num[dept]]; i>=0; i--)   //使用了i个num[dept]
    {
        if(tmp+i*num[dept] > t) continue;
        zishi[dept] = i;
        dfs(dept+1, tmp+i*num[dept], sum+i);
    }
}

int main()
{
    while(scanf("%d%d", &t, &n)==2)
    {
        if(n == 0) break;
        memset(a, 0, sizeof(a));
        kind = 0;
        for(int i=0; i<n; i++)
        {
            int t;
            scanf("%d", &t);
            if(a[t] == 0) num[kind++] = t;
            a[t]++;
        }
        printf("Sums of %d:\n", t);
        cnt = 0;
        dfs(0, 0, 0);
        if(cnt == 0)
            printf("NONE\n");
    }
    return 0;
}

 

posted @ 2015-11-22 16:12  xing-xing  阅读(137)  评论(0)    收藏  举报