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 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 x1,...,xn. 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 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 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 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

Source

浙江工业大学第四届大学生程序设计竞赛
做练习的时候,纠结死啦!
当时我一直在想怎样判重,自己YY了一个hash函数 WA了。。。
网上的一种解法不需要判重,剪枝就可以了。按照那个思路我重新敲了一下。
code1: (dfs+剪枝)
poj:
Accepted 388K 0MS G++ 930B
#include <stdio.h>
#include <string.h> int a[15];
int p[15];
int vis[15];
int t, n, flag; void dfs(int k, int sum) {
int i;
if(k>n || sum<0) return ;
if(sum==0) {
flag = 1;
for(i=0; i<k-1; i++)
printf("%d+",p[i]);
printf("%d\n",p[i]);
return ;
}
for(i=k; i<n; i++)
if(!vis[i]) {
if(sum-a[i]<0||(k>0&&a[i]>p[k-1])) continue;
vis[i] = 1;
p[k] = a[i];
dfs(k+1,sum-a[i]);
vis[i] = 0;
while(i+1<n&&a[i]==a[i+1]) i++; //搜索完毕后,若下一个搜索的数仍与当前相同,则寻找下一个不同的数进行搜索。{去重}
}
}
int main() {
int i;
while(scanf("%d%d",&t,&n),t+n) {
for(i=0; i<n; i++) scanf("%d",&a[i]);
i = 0;
while(i<n&&a[i]>t) i++;
printf("Sums of %d:\n",t);
flag = 0;
memset(vis,0,sizeof(vis));
dfs(i,t);
if(!flag) printf("NONE\n");
}
return 0;
}

code2:(用 set 去重:在POJ和ZOJ上提交全挂,不过hdu上能AC,呃呃呃~) 


HDU:
Accepted 1258 0MS 340K 1286 B G++

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <functional>
#include <vector>
#include <string>
#include <set>
using namespace std;
#define N 20
int t, n;
int a[N];
int list[N];
bool vis[N];
set<string> s;
bool flag; void dfs(int k, int sum) {
int i;
if(k>=n || sum<0) return;
if(sum==0) {
string str;
for(i=0; i<k; i++) {
str +=(list[i]/10) +'0';
str +=(list[i]%10) +'0';
}
if(s.find(str)==s.end()) {
s.insert(str);
flag = 1;
for(i=0; i<k-1; i++)
printf("%d+",list[i]);
printf("%d\n",list[i]);
}
return ;
}
for(i=k; i<n; i++)
if(!vis[i]&&(k==0||a[i]<=list[k-1])) {
vis[i] = 1;
list[k] = a[i];
dfs(k+1,sum-a[i]);
vis[i] = 0;
}
}
int main() {
int i;
while(scanf("%d%d",&t,&n),t+n) {
for(i=0; i<n; i++) {
scanf("%d",&a[i]);
}
memset(vis,0,sizeof(vis));
printf("Sums of %d:\n",t);
flag = false;
s.clear();
dfs(0,t);
if(!flag) printf("NONE\n");
}
return 0;
}


poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)的更多相关文章

  1. poj1564 Sum It Up (zoj 1711 hdu 1258) DFS

    POJhttp://poj.org/problem?id=1564 ZOJhttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=711 ...

  2. poj 1564 Sum It Up

    题目连接 http://poj.org/problem?id=1564 Sum It Up Description Given a specified total t and a list of n ...

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

    http://poj.org/problem?id=1564 该题运用DFS但是要注意去重,不能输出重复的答案 两种去重方式代码中有标出 第一种if(a[i]!=a[i-1])意思是如果这个数a[i] ...

  4. poj 1564 Sum It Up【dfs+去重】

    Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6682   Accepted: 3475 Descrip ...

  5. POJ 1564 Sum It Up(DFS)

    Sum It Up Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  6. POJ 1564 Sum It Up (DFS+剪枝)

                                                                                                       ...

  7. poj 1564 Sum It Up 搜索

    题意: 给出一个数T,再给出n个数.若n个数中有几个数(可以是一个)的和是T,就输出相加的式子.不过不能输出相同的式子. 分析: 运用的是回溯法.比较特殊的一点就是不能输出相同的式子.这个可以通过ma ...

  8. poj 1564 Sum It Up(dfs)

    Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7191   Accepted: 3745 Descrip ...

  9. hdu 4821 字符串hash+map判重 String (长春市赛区I题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4821 昨晚卡了非常久,開始TLE,然后优化了之后,由于几个地方变量写混.一直狂WA.搞得我昨晚都失眠了,,. 这 ...

随机推荐

  1. mysql基础(mysql数据库导入到处) 很基础很实用

    一.MYSQL的命令行模式的设置:桌面->我的电脑->属性->环境变量->新建->PATH=“:path\mysql\bin;”其中path为MYSQL的安装路径.二.简 ...

  2. 转:.Net程序员学习Linux最简单的方法

    有很多关于Linux的书籍,博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语 ...

  3. SEO市场是在扩大还是缩小 Seoer终于会变成什么?

    近期有两件全然背道而驰的事情同一时候发生.第一件事情是以SEO业务为主要业务的业者逐渐降低,很多原本是SEO的业者都纷纷转向其它业务.SEO业务反而变成副业.第二件事情是中小企业的SEO需求添加了.而 ...

  4. dhtmlx之dhtmlXGrid显示数据

    引用 <link href="../../dhtmlXGridScripts/dhtmlxgrid.css" rel="stylesheet" type= ...

  5. hdu2629Identity Card

    Problem Description Do you own an ID card?You must have a identity card number in your family's Hous ...

  6. Content Providers的步骤,来自官网文档

    Content Providers In this document Content provider basics Querying a content provider Modifying dat ...

  7. Python 模块续和面向对象的介绍(六)

    一.基本模块 shutil 文件.目录.压缩包的处理模块 shutil.copyfile(src, dst) 拷贝文件 >>> shutil.copyfile('a.log','b. ...

  8. Windows服务编程集合

    http://zyan.cc/windows_mstsc/ Optionname--Optionvalues描述 type=----own, share, interact, kernel, file ...

  9. vnc server配置、启动、重启与连接,图形管理linux系统

    环境:RedHat Linux 5企业版.Xwindows:gnome (红帽默认安装的图形界面) 尽管我们可以使用SSH连接远程通过字符界面来操作Linux,但是对于更多熟悉图形人来说是很不方便的, ...

  10. Codeforces 85D Sum of Medians(线段树)

    题目链接:Codeforces 85D - Sum of Medians 题目大意:N个操作,add x:向集合中加入x:del x:删除集合中的x:sum:将集合排序后,将集合中全部下标i % 5 ...