poj 1564 Sum It Up (DFS+ 去重+排序)

http://poj.org/problem?id=1564

该题运用DFS但是要注意去重,不能输出重复的答案

两种去重方式代码中有标出

第一种if(a[i]!=a[i-1])意思是如果这个数a[i]和上一个数相同,那么记录数组的同一个位置就没有必要再放入这个数。例如:4 3 3 2构成和是7,b数组的第二个位置放了3,则后面的那个3就没有必要再放入记录数组的第二个位置了。(可能会放到后面的位置)...

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#define N 110

using namespace std;

int a[N], b[N];
int t, n, f;

int cmp(const void *a, const void *b)
{
    return *(int *)b - *(int *)a;
}

void DFS(int k, int j, int sum)
{
    int i;
    if(sum == t)
    {
        f = 1;
        qsort(b, j, sizeof(b[0]), cmp);

        printf("%d", b[0]);

        for(i = 1 ; i < j ; i++)
            printf("+%d", b[i]);

        printf("\n");

        return ;
    }
    for(i = k ; i < n ; i++)
    {
        if(a[i] != a[i - 1] || i == k)
        {
            b[j] = a[i];
            DFS(i + 1, j + 1, sum + a[i]);

        }
        /*if(sum + a[i] <= t)
        {
            b[j] = a[i];
            DFS(i + 1, j + 1, sum + a[i]);
            while(a[i] == a[i + 1] && i + 1 < n)
                i++;//去重
        }*/

    }
}

int main()
{
    int i;
    while(scanf("%d%d", &t, &n), t + n)
    {
        f = 0;
        for(i = 0 ; i < n ; i++)
            scanf("%d", &a[i]);

        qsort(a, n, sizeof(a[0]), cmp);

        printf("Sums of %d:\n", t);

        DFS(0, 0, 0);

        if(f == 0)
            printf("NONE\n");
    }
    return 0;
}
时间: 2024-10-27 12:45:46

poj 1564 Sum It Up (DFS+ 去重+排序)的相关文章

POJ 1564 Sum It Up (DFS+剪枝)

 Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5820   Accepted: 2970 Description 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

poj 1564 Sum It Up 搜索

题意: 给出一个数T,再给出n个数.若n个数中有几个数(可以是一个)的和是T,就输出相加的式子.不过不能输出相同的式子. 分析: 运用的是回溯法.比较特殊的一点就是不能输出相同的式子.这个可以通过map来实现:map<string,int>把字符串(可以是C语言的字符串)和整数联系起来了.我们可以把相加起来的几个数变成一个字符串(2+1+1,变成“211”),如果它出现过,就标记为1,初始值是0.出现过的就不再输出了. 剪枝: 1.所有的数加起来的和小于T,直接输出NONE. 2.搜索过程中,

poj 1564 Sum It Up【dfs+去重】

Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6682   Accepted: 3475 Description 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

POJ 1564 Sum It Up(DFS)

Sum It Up Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 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

[poj 1691] Painting A Board dfs+拓扑排序

Painting A Board Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3611 Accepted: 1795 Description The CE digital company has built an Automatic Painting Machine (APM) to paint a flat board fully covered by adjacent non-overlapping rectangle

poj 1564 Sum It Up

Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7191   Accepted: 3745 Description 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

POJ 1564 经典dfs

1.POJ 1564 Sum It Up 2.总结: 题意:在n个数里输出所有相加为t的情况. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #define F(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memse

【POJ 3321】 Apple Tree (dfs重标号设区间+树状数组求和)

[POJ 3321] Apple Tree (dfs重标号设区间+树状数组求和) Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21966   Accepted: 6654 Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. K

POJ 2907 Collecting Beepers (DFS+回溯)

Description Karel is a robot who lives in a rectangular coordinate system where each place is designated by a set of integer coordinates (x and y). Your job is to design a program that will help Karel pick up a number of beepers that are placed in he