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

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

Java AC 代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; public class Main { static int sum, number; static List<Integer> list ; //存放输入的数据 static List<Integer> path; //结果路径 static List<String> result;//存放结果路径的列表,每次得到结果时,都遍历该列表,看看是否有重复,不重复再往里添加 public static void main(String[] args) { Scanner sc = new Scanner(System.in); while((sum = sc.nextInt()) != 0 && (number = sc.nextInt()) != 0) {
list = new ArrayList<Integer>();
path = new ArrayList<Integer>();
result = new ArrayList<String>(); for(int i = 0; i < number; i++) {
list.add(sc.nextInt());
} for(int i = 0; i < number ; i++) { if(list.get(i) == sum) { //遍历的第一个数(i不一定是0)正好等于sum
boolean flag = true;
for(int j = 0; j < result.size(); j++) { //看结果列表里是否有相同的记过
if(Integer.toString(list.get(i)).equals(result.get(j))) {
flag = false;
break;
}
}
if(flag) {
result.add(Integer.toString(list.get(i))); //没有重复的 就添加进去
}
} else {
for(int j = i + 1; j < number; j++ ) { //i后的每一个数都可以作为第二个数进行遍历(这里应该可以把搜索范围缩小点)
path.add(list.get(i));
dfs(list.get(i), j);
path.remove(path.size() - 1);
}
}
} System.out.println("Sums of " + sum + ":");
if(result.size() > 0){
for(int i = 0; i < result.size(); i++) {
System.out.println(result.get(i));
}
} else {
System.out.println("NONE");
}
}
} public static void dfs(int currentSum, int currentLoc) { //参数是指当前的和 与当前输入列表中的位置 if(currentSum + list.get(currentLoc) == sum) { //得到结果
path.add(list.get(currentLoc));
String res = "";
for(int i = 0; i < path.size() - 1; i++) {
res = res + Integer.toString(path.get(i));
res = res + "+";
}
res = res + Integer.toString(path.get(path.size() - 1)); boolean flag = true;
for(int i = 0; i < result.size(); i++) { //看结果列表里有没有和当前结果重复的
if(res.equals(result.get(i))) {
flag = false;
break;
}
}
if(flag) {
result.add(res);
}
path.remove(path.size() - 1);
return;
} if(currentSum + list.get(currentLoc) > sum) {
return;
} if(currentSum + list.get(currentLoc) < sum) {
for(int i = currentLoc; i < number; i++)
for(int j = i + 1; j < number; j ++) {
path.add(list.get(i)); //这里开始把i写成了currentLoc,对于一些有重复数字的结果就会出错
dfs(currentSum + list.get(i), j);
path.remove(path.size() - 1);
}
}
}
}

poj 1564 Sum It Up(dfs)的更多相关文章

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

                                                                                                       ...

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

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

  3. 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 ...

  4. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

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

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

  6. POJ 1564 Sum It Up(DFS)

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

  7. poj 1564 Sum It Up 搜索

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

  8. POJ 1564 经典dfs

    1.POJ 1564 Sum It Up 2.总结: 题意:在n个数里输出所有相加为t的情况. #include<iostream> #include<cstring> #in ...

  9. (深搜)Sum It Up -- poj --1564

    链接: http://poj.org/problem?id=1564 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#probl ...

随机推荐

  1. springboot 配置访问本地图片

    spring.mvc.static-path-pattern=/image/** spring.resources.static-locations=file:D://image/

  2. springBoot+springSecurity 数据库动态管理用户、角色、权限(二)

    序: 本文使用springboot+mybatis+SpringSecurity 实现数据库动态的管理用户.角色.权限管理 本文细分角色和权限,并将用户.角色.权限和资源均采用数据库存储,并且自定义滤 ...

  3. linux C 加载so文件 指定路径

    在Linux C中动态加载.so文件用dlopen("libdemo.so", RTLD_NOW); 但是默认的so搜索目录不包括当前程序目录,所以必须复制到系统的so目录 才能运 ...

  4. jquery自动播放音频文件

    使用jquery自动播放音频文件 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  5. leetcode 240搜索二维矩阵

    /** 正常的二维搜索估计要超时,本题沿着对角线搜索,然后找到第一个大于目标数字的坐标(x,y)然后搜索(>x,<y)(<x,>y)子区域: 矩阵size() 为m,n:当i& ...

  6. python正则表达式 分割字符串

    使用或 标准的正则表达式有小括号,但是python的没有 # -*- coding: utf-8 -*- import sys import re import sys reload(sys) sys ...

  7. C语言指令数组名和数组名取地址

    以下C语言指令:int a[5] = {1, 3, 5, 7, 9}; int *p = (int *)(&a + 1); printf("%d, %d", *(a + 1 ...

  8. 2018.03.28 python-pandas groupby使用

    groupby 分组统计 1.根据某些条件将数据分组 2.对每个组独立应用函数 3.将结果合并到一个数据结构中 Dataframe在行或列上分组,将一个函数应用到各个分组并产生一个新值,然后函数执行结 ...

  9. WIN10重启后,在任务栏下添加快捷工具栏消失问题修复

    WIN10重启后,在任务栏下添加快捷工具栏消失问题修复 可以在windows 设置 - - 设备 - - 输入 - - 高级键盘设置 - - 不要勾选 <使用桌面语言栏(如果可用 )>

  10. Python --链接MYSQL数据库与简单操作 含SSH链接

    项目是软硬件结合,在缺少设备的情况,需要通过接口来模拟实现与设备的交互,其中就需要通过从数据库读取商品的ID信息 出于安全考虑  现在很多数据库都不允许通过直接访问,大多数是通过SSH SSH : 数 ...