HDU 1258Sum It Up(暴力dfs,記住相同的狀態只保留一個)
Sum It Up
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3300 Accepted Submission(s): 1665
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
題目大意:給你一個數的和sum,最大1000,然後是n(n<=12)個<=100的正數數,a[0],a[1]...a[n-1],選取這裡面的數,使得和為sum,開始準備暴力列舉。。不用那麼麻煩,可以直接暴搜,不過遇到同一個狀態則保留一個,在搜尋的時候每一個點訪問之後,這個值在這個相同的位置不能再次被訪問。因為這點一樣後面的情況肯定一樣了。具體實現見程式碼。
題目地址:Sum It Up
AC程式碼:
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[15],sum,n;
int ans[15];
int flag,tt;
bool cmp(int a,int b)
{
return a>b?1:0;
}
void dfs(int t,int s)
{
int i;
if(s>sum) return;
if(s==sum)
{
cout<<ans[0];
for(i=1;i<tt;i++)
cout<<"+"<<ans[i];
cout<<endl;
flag=1; //說明找到了一個
}
int last=-1;
for(i=t+1;i<n;i++)
{
if(a[i]!=last) //相應的同一個位置的節點不允許相同
{
last=a[i];
ans[tt++]=a[i];
dfs(i,s+a[i]);
tt--;
}
}
}
int main()
{
int i;
while(scanf("%d%d",&sum,&n))
{
flag=0;
if(!sum&&!n) break;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n,cmp);
printf("Sums of %d:\n",sum);
int last=-1;
for(i=0;i<n;i++)
{
if(a[i]!=last) //每次起點不同
{
last=a[i];
tt=0;
ans[tt++]=a[i];
dfs(i,a[i]);
}
}
if(!flag)
puts("NONE");
}
return 0;
}
//0MS
相關文章
- hdu1258 Sum It Up (DFS)
- python合併相同行只保留一行Python
- HDU 5113 Black And White(暴力dfs+減枝)
- sql刪除重複記錄只保留一條SQL
- POJ3279 Fliptile【狀態壓縮+DFS】
- 記前端狀態管理庫Akita中的一個坑前端
- 【DFS】HDU 5423 Rikka with Tree
- mysql 鎖狀態的一些狀態資訊記錄MySql
- MySQL大量髒資料,如何只保留最新的一條?MySql
- HDU 5726-GCD(暴力+map)GC
- HDU 5113 Black And White (dfs)
- POJ 1699 二進位制表示狀態+dfs
- 一個簡單的狀態列示例
- 下一個 Flutter 專案要記住的 11 件事Flutter
- 一個例子記住C++物件的生存週期C++物件
- 如何快速取得一個二進位制狀態的所有子狀態
- HDU 5339 Untitled (狀態壓縮列舉)
- hdu1074動態規劃狀態壓縮動態規劃
- 專訪索尼互娛CEO:玩家只會記住優秀的遊戲遊戲
- HDU 5468 Puzzled Elena(DFS序+容斥原理)
- HDU 5438 Ponds (拓撲排序應用+DFS)排序
- 表單元素設定為只讀狀態
- YT14-HDU-求N^N的個位數(暴力破解版)
- SQL刪除重複資料,只保留一行SQL
- 談一談動態規劃和dfs動態規劃
- 一個有限狀態機的C++實現C++
- c++ io條件狀態 的一個例子C++
- HDU 5536 Chip Factory (暴力 或者 01Trie)
- HDU 5769-Substring(字尾陣列-不相同的子串的個數)陣列
- 檢視一個通訊埠狀態
- 教你一招,如何設定一個容易記住又安全的密碼密碼
- 如何將表單元素設定為只讀狀態
- 需要恢復中斷狀態的一個場景
- NSToolbar 只保留自定義工具欄選項
- solaris 網路卡為何ifconfig -a沒有顯示up狀態
- 在 vue-router 跳轉過程中保留頁面元件的值狀態Vue元件
- 怎樣Oracle把多條記錄的相同欄位拼成一個字串Oracle字串
- 一個簡潔且強大的狀態管理庫 - iFlow