HDU1258 Sum It Up(DFS)

来源:互联网 发布:udp端口在线扫描 编辑:程序博客网 时间:2024/05/21 16:43

DFS的练习,当数字大于和时进行剪枝。这题的关键在于过滤掉之前DFS过的值,这里采用的是记录上一个阶段使用的值,并与当前的值进行比较,不相等才能进行DFS

#include<iostream>using namespace std;int num[20],s[20],n,m,flag;void dfs(int x,int cnt,int z){    int d;    if(z > n) return ;    if(z == n){        flag = 1;        for(int i = 0;i<cnt;i++){            if(i == cnt-1)                printf("%d\n",s[i]);            else printf("%d+",s[i]);        }    }    d = -1;    for(int i = x;i<m;i++){        if(num[i] != d){            s[cnt] = num[i];            d = num[i];            dfs(i+1,cnt+1,z+num[i]);        }    }    return ;}int main(){    while(scanf("%d %d",&n,&m),n,m){        for(int i = 0;i<m;i++)            scanf("%d",&num[i]);        printf("Sums of %d:\n",n);        flag = 0;        dfs(0,0,0);        if(!flag)            printf("NONE\n");    }    return 0;}


0 0
原创粉丝点击