hdu1258(dfs)

来源:互联网 发布:淘宝主页设计 编辑:程序博客网 时间:2024/06/03 05:55

题目链接:Sum It Up

题目大意:给出一组数a[n]={x1,x2,x3...xn}和t,求出a[n]的子集使得子集中的元素之和=t

每个数只能使用一次,不能输出重复的子集

分析:简单dfs,vis判断某个数是否使用过

!!!注意不能输出两个相同的子集,即某个数不能再相同的位置使用两次

用last记录上次此位置使用的数,若相同则跳过

#include <stdio.h>#include <memory.h>const int maxn=15;int a[maxn],vis[maxn],t,n;bool flag;void dfs(int i,int sum){    if(i==n+1)return;    if(sum>t)return;    if(sum==t){        flag=true;        bool atag=false;        for(int k=0;k<i;k++){            if(vis[k]){                if(atag)printf("+");                else {                    atag=true;                }                printf("%d",a[k]);            }        }        printf("\n");    }    int last=-1;    for(int k=i;k<n;k++){        if(!vis[k]&&last!=a[k]){            last=a[k];            vis[k]=true;            dfs(k+1,sum+a[k]);            vis[k]=false;        }    }}int main(){    //freopen("in.txt","r",stdin);    while(scanf("%d %d",&t,&n)!=EOF&&(t+n)){        flag=false;        for(int i=0;i<n;i++)scanf("%d",&a[i]);        memset(vis,0,sizeof(vis));        printf("Sums of %d:\n",t);        dfs(0,0);        if(!flag)printf("NONE\n");    }    return 0;}


0 0