G - Sum It Up -深搜

题目:

Given a specified total t and a list of n integers, find all distinct sums using numbers from the list that add up to t. For example, if t=4, n=6, and the list is [4,3,2,2,1,1], then there are four different sums that equal 4: 4,3+1,2+2, and 2+1+1.(A number can be used within a sum as many times as it appears in the list, and a single number counts as a sum.) Your job is to solve this problem in general. 

Input

The input will contain one or more test cases, one per line. Each test case contains t, the total, followed by n, the number of integers in the list, followed by n integers x1,...,xn. If n=0 it signals the end of the input; otherwise, t will be a positive integer less than 1000, n will be an integer between 1 and 12(inclusive), and x1,...,xn will be positive integers less than 100. All numbers will be separated by exactly one space. The numbers in each list appear in nonincreasing order, and there may be repetitions. 

Output

For each test case, first output a line containing 'Sums of', the total, and a colon. Then output each sum, one per line; if there are no sums, output the line 'NONE'. The numbers within each sum must appear in nonincreasing order. A number may be repeated in the sum as many times as it was repeated in the original list. The sums themselves must be sorted in decreasing order based on the numbers appearing in the sum. In other words, the sums must be sorted by their first number; sums with the same first number must be sorted by their second number; sums with the same first two numbers must be sorted by their third number; and so on. Within each test case, all sums must be distince; the same sum connot appear twice. 

Sample Input

4 6 4 3 2 2 1 1
5 3 2 1 1
400 12 50 50 50 50 50 50 25 25 25 25 25 25
0 0

Sample Output

Sums of 4:
4
3+1
2+2
2+1+1
Sums of 5:
NONE
Sums of 400:
50+50+50+50+50+50+25+25+25+25
50+50+50+50+50+25+25+25+25+25+25

 

题目大意:

有多组输入,首先输入t和n,随后由大到小输入n个数,找到后面的数的和等于t的,按输入顺序,用+连接输出所有情况,若不存在有和等于t的,就输出none。

 

思路:

相当于树形结构搜一遍这组数据,边搜边存,结果暂存在一个vector里,

若存的数的和等于t,则马上输出,并不继续向下搜,返回上一级;

若大于t,则直接返回上一级;

若小于t,则继续向下一级搜;

每一级用for循环来遍历,若有重复的,就跳过,重点是这一句:

 if((num[i]+sum>t)||(i>op&&num[i]==num[i-1])){
            continue;

  }

 

在搜索中,vector不需要清空,只需在结束一个bfs函数后,删掉上一次加入的数,递归的思想,考虑第一层即可。

 

代码如下:


#include<cstdio>
#include<iostream>
#include <cstring>
#include<vector>

using namespace std;

vector <int>q;///存的结果数值
int num[1500];///存的全部数值
int t,n;
//int cont;
bool flag;

void BFS(int op,int sum){
    if(sum == t){
        for(int i=0;i<q.size() ; i++){
            if(i!=0)
                printf("+");
            printf("%d",q[i]);
          //  q.pop();
        }
        printf("\n");
       flag = true;
       return ;
    }
    for(int i=op;i<=n-1;i++){
        if((num[i]+sum>t)||(i>op&&num[i]==num[i-1])){
            continue;
        }
        sum = sum + num[i];
        q.push_back(num[i]);
        BFS(i+1,sum);
        sum = sum - num[i];
        q.pop_back();
    }

}
int main(){

    while(~scanf("%d%d",&t,&n)){
        if(t==0&&n==0)
            break;
        for(int i=1;i<=n;i++){
            scanf("%d",&num[i-1]);
        }
        flag=false;
        printf("Sums of %d:\n",t);
      //  cont = 0;
        q.clear();
        BFS(0,0);
        if(!flag){
            printf("NONE\n");
        }


    }
    return 0;
}

 

个人总结:

这道题让我更深入的了解到深搜,其实就是一种暴力遍历,发现只要是将题目数据转换成树的结构去解决,就可以轻易用深搜广搜来写。但并且认识到了一个很厉害的数据结构:vector!

vector的具体使用如下:

http://www.cnblogs.com/Nonono-nw/p/3462183.html

http://www.cnblogs.com/mengfanrong/p/3770971.html

可以进行更加深入的学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值