hdu 1258 从n个数中找和为t的组合

题意:首先给你一个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

 1 # include <cstdio>
 2 # include <cmath>
 3 # include <iostream>
 4 # include <cstring>
 5 # include <algorithm>
 6 using namespace std ;
 7 int t,n,flag;
 8 int num[14],save[14];
 9
10 bool cmp(int x , int y)
11 {
12     return x > y ;
13 }
14
15 void dfs(int i,int sum,int count){
16     if(sum>t)
17         return ;
18     if(sum==t){
19         for(int j=0;j<count-1;j++){
20             printf("%d+",save[j]);
21         }
22         printf("%d\n",save[count-1]);
23         flag=1;
24         return;
25     }
26     int tag=-1;
27     for(int k=i;k<n;k++){
28         if(num[k]!=tag){
29             save[count]=num[k];
30             sum+=num[k]; //每次的和
31             tag=num[k];  //保留当前的数,能避免重复  假如是 4 2 2  前一个2已经被排除 则不用考虑后一个2
32             dfs(k+1,sum,count+1);
33             sum-=num[k];
34         }
35     }
36 }
37
38 int main(){
39    // freopen("in.txt","r",stdin) ;
40     while(scanf("%d%d",&t,&n)!=EOF){
41         if(n==0)break;
42         for(int i=0;i<n;i++){
43             scanf("%d",&num[i]);
44         }
45         flag=0;
46         sort(num,num+n,cmp) ;
47         printf("Sums of %d:\n",t);
48         dfs(0,0,0);
49         if(!flag){
50             printf("NONE\n");
51         }
52
53     }
54     return 0;
55 }

时间: 2024-10-09 18:19:43

hdu 1258 从n个数中找和为t的组合的相关文章

【海量数据处理】N个数中找出最大的前K个数

N个数中找出最大的前K个数,需要用小堆实现. 分析:由于小堆的堆顶存放堆中最小的数据,可以通过与堆顶数据进行比较,将大数据存放在堆中,注意在每次改变堆顶数据后,进行调堆,使堆顶一直存放整个堆中最小元素. void AdjustDown(int *a, size_t root, size_t size)//下调 {//小堆 size_t parent = root; size_t child = parent * 2 + 1; while (child < size) { if (child + 

ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)

1061: 从三个数中找出最大的数Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 124[Submit][Status][Web Board] Description 定义一个带参的宏(或者模板函数),从三个数中找出最大的数. Input 3个短整型数,空格隔开 3个实数,空格隔开 3个长整数,空格隔开 Output 最大的数,对于实数保留2位小数. Sample Input 1 2 3 1.5 4.7 3.2 123456

三个数中找最大

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 三个数中找最大 { class Program { static void Main(string[] args) { Console.WriteLine("三个数中找最大"); int A = int.Parse(Console.ReadLine()); //Console.ReadLine()

面试题-10亿个数中找出最大的10000个数(top K问题)

一个较好的方法:先拿出10000个建立小根堆,对于剩下的元素,如果大于堆顶元素的值,删除堆顶元素,再进行插入操作,否则直接跳过,这样知道所有元素遍历完,堆中的10000个就是最大的10000个.时间复杂度: m + (n-1)logm = O(nlogm) 优化的方法:可以把所有10亿个数据分组存放,比如分别放在1000个文件中(如果是字符串hash(x)%M).对每个文件,建立大小为10000的小根堆,然后按有序数组的合并合并起来,取出最大的10000个即是答案. top K问题 在大规模数据

100万个数中找出最大的前K个数

拿到这个题目我想到了很多方法,但是在我想到的方法中,要把在100万个数中找到前k个数,都不适用.最后通过我的不断研究,我想到了我认为最简单的方法,就是利用堆来做这道题目. 下面我分析一下我用堆排序的思路: 1.我先建一个大小为k的堆. 2.把100万中前k个数放到这个堆中. 3.把这个堆调成小堆. 4.把100万个从k到100万之间的数字拿出来和堆的根结点作比较. 5.如果根结点小于这之间的某一个数,就把这个数拿给根结点,然后继续调成小堆.否则继续找 6.直到找完这100万个数,堆中放的就是最大

A+B Again(在某个数中找大于m的最小约数)

A+B Again Accepted : 15   Submit : 243 Time Limit : 1000 MS   Memory Limit : 65536 KB  题目描述 上次趣味赛小明的a+b坑了不少不喜欢思考的同学,小明为了表示歉意, 这次出了道简单的a+b给大家当签到题,希望大家能开心刷题. 那么,题目来了!!! 求使得b/(a+x)为整数的最小正整数x的值. 输入 第一行是一个整数K(K≤10000),表示样例的个数. 以后每行一个样例,为两个正整数a,b(1≤a,b≤108

在四个数中找最大值和最大值

// // Copyright (C) 2014软件1班 // All rights reseved. // 作 者:A36 黄阿德 // 完成日期:2014年12月4日 // // 问题描述:创建一个程序找四个数的最小值和最大值,然后输出 // 输入描述:输入四个实数 // 输出描述:两个数,最小值和最大值 // using System; using System.Collections.Generic; using System.Linq; using System.Text; using

xtuoj A+B Again(在某个数中找大于m的最小约数)

新生赛: Accepted : 15   Submit : 243 Time Limit : 1000 MS   Memory Limit : 65536 KB  题目描述 上次趣味赛小明的a+b坑了不少不喜欢思考的同学,小明为了表示歉意, 这次出了道简单的a+b给大家当签到题,希望大家能开心刷题. 那么,题目来了!!! 求使得b/(a+x)为整数的最小正整数x的值. 输入 第一行是一个整数K(K≤10000),表示样例的个数. 以后每行一个样例,为两个正整数a,b(1≤a,b≤108). 输出

poj2578---三个数中找出第一个大于168的

#include <stdio.h> #include <stdlib.h> int main() { int a,b,c; scanf("%d %d %d",&a,&b,&c); if(a <= 168) { printf("CRASH %d\n",a); return 0; } if(b <= 168) { printf("CRASH %d\n",b); return 0; } if