poj 1564 Sum It Up【dfs+去重】
2015-08-17 17:53
561 查看
Sum It Up
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
Sample Output
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 6682 | Accepted: 3475 |
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
#include<stdio.h> #include<string.h> #define MAX 1100 int n,m,k,ok; int a[MAX],b[MAX]; void dfs(int pos,int tot,int k) { int i,j; if(tot==n) { ok=1; for(j=0;j<k;j++) { if(!j) printf("%d",b[j]); else printf("+%d",b[j]); } printf("\n"); return ; } for(i=pos;i<m;i++) { b[k]=a[i]; dfs(i+1,tot+a[i],k+1); while(a[i]==a[i+1])//去重 ++i; } } int main() { int i,j; while(scanf("%d%d",&n,&m),n|m) { for(i=0;i<m;i++) scanf("%d",&a[i]); k=0; ok=0; printf("Sums of %d:\n",n); dfs(0,0,0); if(!ok) printf("NONE\n"); } return 0; }
相关文章推荐
- 数据库设计理论及应用(3)——需求分析及数据流图
- 埃博拉病毒死亡展示了大批医护人员?
- 代码格式工具
- android:获得poi图片的一种方法(百度地图api)
- APK动态加载框架(DL)解析
- oracle 查看用户所在的表空间
- iPhone怎么建立WiFi热点,供电脑手机上网
- 在iPad iOS8环境下打开相册或者拍照
- Accessing Scoped Variables
- Android annotations REST
- eclipse优化之取消eclipse拼写错误检查
- spring mvc 的常用pom文件
- 关于百度地图开发中可能遇到Conversion to Dalvik format failed with error 1
- 基于MySQL Workbench的SQL开发
- POJ 2631 -- Roads in the North【树的直径 && 裸题】
- poj 3744 Scout YYF I (矩阵)
- git 常用命令
- hdu1285
- uva725_一道水题(优化到了29ms)
- LightOj 1112 Curious Robin Hood(线段树||树状数组)