HDU 1258 Sum It Up
2016-01-19 17:31
267 查看
Sum It Up
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)Total Submission(s) : 4 Accepted Submission(s) : 1
Font: Times New Roman | Verdana |
Georgia
Font Size: ← →
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 sumsthat 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 endof 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 appearin 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
分析:一道DFS题目,按降序排序后,找到加起来和为num的数。难点在于如何去除重复的。
处理方法见代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int a[1005];
int temp[1005];
int peace,sum,n;
int cmp(const void *a,const void *b)
{
return *(int *)b-*(int *)a;
}
void dfs(int num,int t,int m)
{
int i;
if(num>sum)
return ;
if(num==sum)
{
peace=0;
printf("%d",temp[0]);
for(i=1;i<t;i++)
printf("+%d",temp[i]);
putchar('\n');
return ;
}
for(i=m;i<=n;i++)
{
temp[t]=a[i];
dfs(num+a[i],t+1,i+1);
while(i+1<=n && a[i]==a[i+1]) //重复数据处理
i++;
}
}
int main()
{
int num;
int i,j;
while(scanf("%d %d",&sum,&n),sum||n)
{
num=0;
for(i=1;i<=n;i++)
{
scanf("%d",a+i);
}
printf("Sums of %d:\n",sum);
qsort(&a[1],n,sizeof(a[1]),cmp);
peace=1;
dfs(0,0,1);
if(peace)
printf("NONE\n");
}
return 0;
}
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 深度优先搜索的用法——lake counting
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- HDU 1568
- HDU1290
- POJ1523 SPF dfs
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297