Sum It Up---poj1564(dfs)

题目链接:http://poj.org/problem?id=1564

给出m个数,求出和为n的组合方式;并按从大到小的顺序输出;

简单的dfs但是看了代码才会;

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, flag;
int a[11000], b[11000];
int cmp(int a, int b)
{
    return a>b;
}
void dfs(int pos, int len, int sum)///pos代表位置;
{
    if(sum==n)
    {
        flag=1;
        printf("%d", b[0]);
        for(int i=1; i<len; i++)
            printf("+%d", b[i]);
        printf("\n");
        return ;
    }
    for(int i=pos; i<m; i++)
    {
        if(sum+a[i]<=n)
        {
            b[len]=a[i];
            dfs(i+1, len+1, sum+a[i]);
            while(i+1<m && a[i]==a[i+1])i++;///去重;
        }
    }
}
int main()
{
    while(scanf("%d %d", &n, &m), m+n)
    {
        for(int i=0; i<m; i++)
            scanf("%d", &a[i]);
        sort(a, a+m, cmp);
        flag = 0;
        printf("Sums of %d:\n", n);
        dfs(0, 0, 0);
        if(flag==0)
            printf("NONE\n");
    }
    return 0;
}
View Code

 

posted @ 2015-08-19 09:07  西瓜不懂柠檬的酸  Views(185)  Comments(0)    收藏  举报
levels of contents