L - Sum It Up

L - Sum It Up

Time Limit:1000MS     Memory Limit:10000KB     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 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 x 1 , . . . , x n . 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 x 1 , . . . , x n 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 distinct; the same sum cannot 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

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 int num[15];
 6 int way[15];
 7 int T,N;
 8 int all,all_ti;
 9
10 void dfs(int now)
11 {
12     if (all==T)
13     {
14         int i=1;
15         for (;i<=N;i++)
16         {
17             if (way[i]==1)
18             {
19                 cout<<num[i];
20                 break;
21             }
22         }
23         for (i++;i<=N;i++)
24         {
25             if (way[i]==1)
26             {
27                 cout<<"+"<<num[i];
28             }
29         }
30         cout<<endl;
31
32         all_ti++;
33         way[now]=0;
34         all-=num[now];
35     }
36     else
37     {
38         int last=-1;
39         for (int j=now;j<=N;j++)
40         {
41             if (way[j]==0 && num[j]+all<=T&&last!=num[j])
42             {
43                 last=num[j];
44                 way[j]=1;
45                 all+=num[j];
46                 dfs(j);
47
48             }
49         }
50         way[now]=0;
51         all-=num[now];
52     }
53
54 }
55
56 int cmp(int x,int y)
57 {return x>y;}
58
59
60 int main()
61 {
62
63     while (cin>>T>>N)
64     {
65         if (N==0) break;
66         all=all_ti=0;
67         for (int i=1;i<=N;i++)
68         {
69             cin>>num[i];
70             way[i]=0;
71         }
72         sort(num+1,num+1+N,cmp);
73         cout<<"Sums of "<<T<<":"<<endl;
74         dfs(1);
75         if (all_ti==0) cout<<"NONE"<<endl;
76
77     }
78     return 0;
79 }




时间: 2024-08-24 06:41:42

L - Sum It Up的相关文章

4 Values whose Sum is 0

Description The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d ) AxBxCxD are such that a + b + c + d = 0 . In the following, we assume that all lists have the same size

Path Sum III Leetcode

You are given a binary tree in which each node contains an integer value. Find the number of paths that sum to a given value. The path does not need to start or end at the root or a leaf, but it must go downwards (traveling only from parent nodes to

poj 2379 Sum of Consecutive Prime Numbers

Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24498   Accepted: 13326 Description Some positive integers can be represented by a sum of one or more consecutive prime numbers. How many such representatio

【HDOJ】3473 Minimum Sum

划分树解.主席树解MLE. 1 /* 3473 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector> 10 #include <deque>

Python标准库:内置函数sum(iterable[, start])

本函数用来计算可迭代对象iterable的和,然后以这个结果再加上start的值.参数start用来指定相加的参数,如果没有设置这个值,默认是0值.要计算和的序列一般是数字类型,并且开始参数要设置为数字类型.其它有些情况之下,使用别的计算和的方式会更好,比如计算字符串的和使用''.join(sequence):或者计算浮点数的和使用math.fsum():或者计算多序列的和使用itertools.chain(). 例子: #sum() l = range(10) print(l, '=', su

UVA10827 - Maximum sum on a torus

题目链接 题意:给出一个环形矩阵,也就是第一行和最后一行是相连的,第一列和最后一列是相连的,求最大的子矩阵的和 思路:只要将矩阵复制四个,那么就可以按照求一个矩阵内最大子矩阵之和的做法去做,即枚举所有子矩阵的和,更新最大值.要注意在转换后的大矩阵,枚举的子矩阵规格是有范围的. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using name

sum max(hdu 1003)

观察可以发现,0,1,2,--,n结尾的分组中, maxsum a[0] = a[0] maxsum a[1] = max( a[0] + a[1] ,a[1])  = max( maxsum a[0] + a[1] ,a[1]) maxsum a[2] = max( max ( a[0] + a[1] + a[2],a[1] + a[2] ),a[2]) = max(  max( a[0] + a[1] ,a[1]) + a[2] , a[2]) = max(  maxsum a[1] + a

UVA - 108 - Maximum Sum (简单贪心)

UVA - 108 Maximum Sum Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Background A problem that is simple to solve in one dimension is often much more difficult to solve in more than one dimension.

Codeforces Round #365 (Div. 2) D.Mishka and Interesting sum

题目链接:传送门 题目大意:给n个数,m次询问,每次询问区间 l,r 内出现偶数次数的异或和 题目思路:前缀和+离线处理+树状数组 首先可以知道, l,r 内出现奇数次的数的和,就是把 l,r内所有数异或起来就是答案,那么出现偶数次的数就可以 先求出区间 l,r 内有多少不同的数,将这些数异或起来,再异或上区间内出现奇数次的数的异或和就是答案.(出现偶数次的数异或后为0,奇数次的数异或后是本身   然后离线处理询问,对询问按右端点 sort,因为树状数组保存的是数出现的最后位置.离线处理询问后便