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
相關文章
- python合併相同行只保留一行Python
- sql刪除重複記錄只保留一條SQL
- HDU 3006 The Number of set (狀態壓縮)
- POJ3279 Fliptile【狀態壓縮+DFS】
- 記前端狀態管理庫Akita中的一個坑前端
- HDU1427速算24點(dfs)
- HDU 1427-速算24點(DFS)
- HDU - 2553 N皇后問題(DFS)
- mysql 鎖狀態的一些狀態資訊記錄MySql
- 火幣網是用什麼記住使用者登入狀態的?
- MySQL大量髒資料,如何只保留最新的一條?MySql
- hdu 6446 Tree and Permutation(dfs+思維)
- HDU 5816 Hearthstone(狀態壓縮DP+概率)
- 下一個 Flutter 專案要記住的 11 件事Flutter
- hdu--5418Victor and World+狀態壓縮DP
- HDU 1394 Minimum Inversion Number (暴力+線段樹)
- 專訪索尼互娛CEO:玩家只會記住優秀的遊戲遊戲
- 一個有限狀態機的C++實現C++
- c++ io條件狀態 的一個例子C++
- 談一談動態規劃和dfs動態規劃
- 檢視一個通訊埠狀態
- NSToolbar 只保留自定義工具欄選項
- 在 vue-router 跳轉過程中保留頁面元件的值狀態Vue元件
- 懸浮球只在一側滑動 並且是橫屏狀態下
- Linux 基金會網站在離線狀態下仍遭受暴力攻擊Linux網站
- Flink狀態(一)
- [譯] 一個簡單方式教你記住Kotlin的形參和實參Kotlin
- Flutter的一個更精簡的狀態管理工具:consumerFlutter
- java實現用一個變數表示多個屬性的狀態Java變數
- HDU 1074 Doing Homework(狀壓DP)
- 用Class寫一個記住使用者離開位置的js外掛JS
- [譯] SpaceAce 瞭解一下,一個新的前端狀態管理庫前端
- 使用 Hooks 實現一個簡單的狀態管理器Hook
- 一個小技巧助您減少if語句的狀態判斷
- 主用ATC系統執行狀態筆記(一)筆記
- 獎金up up up!單個漏洞最高獎勵2萬元!
- 用mongodb 固定集合實現只保留固定數量的記錄,自動淘汰老舊資料MongoDB
- 輸入兩個長度相同的字串,比較兩個數在相同位置的字元是否相同字串字元
- DFS入門筆記筆記