您的位置:首页 > 其它

POJ 1564 Sum It Up

2013-06-22 14:30 225 查看
题目大意:给你N个数,加起来等于T的方式有多少种,不重复的输出出来。

思路:先用深搜搜出可选结果。然后再结果中找到那些已经选中的结果。具体筛选过程看注释

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int tot,n;
int a[1005];
int vis[1005];
int v[1005];
int t[1005];
int k;
int flag;
int dfs(int sum,int cur,int pos)
{
   // printf("sum=%d  cur=%d\n",sum,cur);
    if(sum==tot)
    {
            flag=1;
            for(k=0;k<cur-1;k++)
                printf("%d+",t[k]);
            printf("%d",t[k]);
            printf("\n");
            return 1;
    }
    else if(sum>tot)return 0;

    for(int i=pos;i<n;i++)
    {
        if(vis[i]==1)continue;
        if(sum+a[i]<=tot)
        {
        vis[i]=1;
        t[cur]=a[i];
        dfs(sum+a[i],cur+1,i);
        vis[i]=0;

        }
        while(i<n&&a[i]==a[i+1])    //此处为筛选,就是在搜索完成以后,那么这个数字的所有可能情况都被搜过了,就可以直接跳过了。
            i++;

    }
}
int main()
{
    while(scanf("%d%d",&tot,&n)!=EOF && tot && n)
    {
        flag=0;
        memset(vis,0,sizeof(vis));
        memset(v,0,sizeof(v));
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        printf("Sums of %d:\n",tot);
       dfs(0,0,0);
       if(!flag)printf("NONE\n");

     

    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: