HDU 1258 Sum It Up DFS 简单题 好题

给出一个数t,n,然后后面有n个数。

问:从这n个数里面能不能挑出一些数,使得和为t,注意输出顺序。

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

要满足这种输出顺序,知道预先将数组从大到小排列就OK了。

dfs(int cnt,int cnr,int sum)

cnt 表示当前ans数组放进了多少个数字,

cur 表示当前加进去的数在a数组的位置

sum 表示当前的和

用一个pre防止相同的数在相同条件下加进去。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=1010;
 6 const int inf=0x3f3f3f3f;
 7 int a[maxn];
 8 int t,n;
 9 bool vis[maxn];
10 int ans[maxn];
11 bool flag;   //判断有没有解
12 bool cmp(int b,int c)
13 {
14     return b>c;
15 }
16 void dfs(int cnt,int cur,int sum)
17 {
18     if(sum>t||cnt>n)
19         return ;
20     ans[cnt]=a[cur];
21     if(sum==t)
22     {
23         for(int i=1;i<cnt;i++)
24             printf("%d+",ans[i]);
25         printf("%d\n",ans[cnt]);
26         flag=true;
27         return ;
28     }
29     int pre=inf;    //防止相同的数在相同的条件下加进去
30     for(int i=cur+1;i<=n;i++)
31     {
32         if(!vis[i]&&a[i]!=pre){
33             vis[i]=true;
34             pre=a[i];        //及时更新
35             dfs(cnt+1,i,sum+a[i]);
36             vis[i]=false;    //回溯
37         }
38     }
39 }
40 int main()
41 {
42     while(scanf("%d%d",&t,&n))
43     {
44         if(t==0&&n==0)
45             break;
46         for(int i=1;i<=n;i++)
47             scanf("%d",&a[i]);
48         memset(vis,false,sizeof(vis));   //初始化
49         sort(a+1,a+n+1,cmp);
50         a[0]=inf;
51         flag=false;   //假设没有解,找到解后为true
52         printf("Sums of %d:\n",t);
53         int pre=inf;
54         for(int i=1;i<=n;i++)
55         {
56             if(a[i]!=pre)
57             {
58                 vis[i]=true;
59                 dfs(1,i,a[i]);
60                 vis[i]=false;    //回溯
61                 pre=a[i];
62             }
63         }
64         if(!flag)
65             printf("NONE\n");
66     }
67     return 0;
68 }

时间: 2024-10-13 05:51:24

HDU 1258 Sum It Up DFS 简单题 好题的相关文章

HDU 1258 Sum It Up(DFS)

题目链接 Problem 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=6, and the list is [4,3,2,2,1,1], then there are four different sums that equal 4

hdu 1258 Sum It Up (dfs+路径记录)

Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3953    Accepted Submission(s): 2032 Problem Description Given a specified total t and a list of n integers, find all distinct sums usi

HDU 1258 Sum It Up(dfs 巧妙去重)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1258 Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7758    Accepted Submission(s): 4067 Problem Description Given a specified total t a

HDU 1258 Sum It Up 深搜

 Crawling in process... Crawling failed   Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1258 Description Given a specified total t and a list of n integers, find all distinct sums using numb

hdu 1258 Sum It Up(dfs+去重)

题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = [4,3,2,2,1,1]. 有四种不同的方法使得它们相加的结果等于total(即等于4),分别为:4,3+1,2+2, 2+1+1. 在同一种拼凑方式中,每个数字不能被重复使用,但是在list中可能存在许多相等的数字. 输入: 输入包含许多测试用例,每个用例仅占一行.每个用例包含t(total)

HDU 1258 Sum It Up (dfs)

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int a[20]; int ans[20]; int num[200]; struct Mark { int shu,rt; }; Mark mark[20]; int ok; int n,t; int cnt; int cmp(int x,int y) { retur

HDU 2553 N皇后问题 DFS 简单题

Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出有多少种合法的放置方法. Input 共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量:如果N=0,表示结束. Output 共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量. Sample Input 1 8 5 0 Sample Output 1 92 10 只需要开一

HDU 1258 Sum It Up (POJ 1564)

以前做过,碰巧看到了.我去复制了一下.很奇怪--交POJ的程序交HDU 就WA. 然后重写,交HDU的程序AC后再去交 POJ 居然TLE.简直-- 简单DFS,判重就好了. HDU : #include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<stack> #

HDU 1258:Sum It Up

Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3695    Accepted Submission(s): 1873 Problem Description Given a specified total t and a list of n integers, find all distinct sums usi