poj sum it up

本文介绍如何使用深度搜索算法解决和求解特定问题,包括处理重复元素和非递增条件,通过实例演示实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


题目大意:给一个t和n个数要你找出在n个数中找出哪几个数相加和为t,条件是不能重复且非递增

用深搜来求

判断重复   非递增




#include<iostream>  
using namespace std;  
int in[15],out[15],use[15]={0};  
int t,n,flag,sum;  
void dfs(int s,int k)  
{  
    if(sum>t) return;  
    if(sum==t)  
    {  
        for(int b=0;b<k;b++)  
            if(b==0)  
                printf("%d",out[b]);  
            else  
                printf("+%d",out[b]);  
        printf("\n");  
        flag=1;//标记有没有结果  
        return;  
    }  
    int j=-10;  
    for(int a=s;a<n;a++)  
    {  
        if(!use[a]&&j!=in[a])//j!=in[a]用于判断后面有没有相同的数  
        {  
            j=in[a];  
            use[a]=1;  
            out[k]=in[a];  
            sum=sum+in[a];  
            dfs(a,k+1);//注意是a而不是s+1,如果是s+1的话每组数据都有n次往回找  
            use[a]=0;  
            sum=sum-in[a];//每次回溯记得减in[a]  
        }  
    }  
}  
int main()  
{  
    while(scanf("%d%d",&t,&n),t+n)  
    {  
        int a=0;  
        memset(in,0,sizeof(in));  
        for(a=0;a<n;a++)  
        {  
            scanf("%d",&in[a]);  
        }  
        printf("Sums of %d:\n",t);  
        sum=flag=0;  
        memset(use,0,sizeof(use));//忘记初始化了...  
        memset(out,0,sizeof(out));  
        dfs(0,0);//用两个参数比用一个参数容易些  
        if(flag==0)  
            printf("NONE\n");  
    }  
    return 0;  




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值