1. 程式人生 > >【hdoj_1015】Safecracker(排列組合)

【hdoj_1015】Safecracker(排列組合)

題意:從給定的幾個元素選擇出符合5個組成一個組合,輸出字典序的最後一個符合要求的組合,如果不存在符合要求的組合,則輸出"no solution".

從若干元素中選擇出5個元素,初看是組合問題,其實不是,因為組合問題選擇出來的組合沒有順序的要求,如[X Z U B A]和[U X B A Z]是一個組合,但是對於本題來說,這兩種組合是不同的,因為選擇出來的如何和[v,w,x,y,z]對應,即v,w,x,y,z分別是多少有5!中可能,所以本題不是簡單的組合問題,二是組合+排列問題,可以在全排列問題的基礎上求解.

程式碼如下:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int target;
string s;
int a[100];
int b[10]; 
int vis[100];

int n,k;
int flag;

void dfs(int cur)
{
	if(cur==k+1)//已經選擇了k個數字
	{
		int sum = b[1] - b[2]*b[2] + b[3]*b[3]*b[3] - b[4]*b[4]*b[4]*b[4] + b[5]*b[5]*b[5]*b[5]*b[5];
		if(sum==target)//判斷是否滿足要求
			flag = 1;
		return;//無論如何,此次遞迴結束,一定要加這句話,否則超時
	}

	for(int i=n;i>=1;i--)//從後面開始,以滿足[輸出字典序最後一個]的要求
	{
		if(!vis[i])
		{
			vis[i] = 1;//標記已經訪問過了
			b[cur] = a[i];
			dfs(cur+1);
			if(flag) return;//看看是否有必要回溯:如果已經成功了,則直接退出
			vis[i] = 0;//回溯
		}
	}
}

int main()
{
	while(1)
	{
		cin >> target >> s;
		if(target==0 && s.compare("END")==0)
			break;
		n = s.length();
		for(int i=1;i<=n;i++)
		{
			a[i] = s[i-1]-'A'+1;//轉化為對應數字
			vis[i] = 0;//標記陣列初始化
		}
		sort(a+1,a+n+1);//排序,注意a[1~n]的下標是從1開始的
		flag = 0;
		k = 5;
		dfs(1);
		if(flag)
		{
			for(int i=1;i<=k;i++)
			{
				char x = b[i]+'A'-1;//轉化為字元
				cout << x;
			}
			cout << endl;
		}
		else
			cout << "no solution" << endl;
	}

	return 0;
}
上述程式碼提交,可以通過.

注意:在判斷遞迴邊界的時候,一定要return,標誌此次遞迴的結束,否則,有可能不知道什麼時候結束此次遞迴,從而造成超時.所以,在上述程式碼中,處理遞迴邊界的時候,無論是否找到滿足要求的解,都要return.

相關推薦

hdoj_1015Safecracker(排列組合)

題意:從給定的幾個元素選擇出符合5個組成一個組合,輸出字典序的最後一個符合要求的組合,如果不存在符合要求的組合,則輸出"no solution". 從若干元素中選擇出5個元素,初看是組合問題,其實

組合數學+錯排問題p4071[SDOI2016]排列計數

列數 out input while tro 理解 mod void script Description 求有多少種長度為 n 的序列 A,滿足以下條件: 1 ~ n 這 n 個數在序列中各出現了一次 若第 i 個數 A[i] 的值為 i,則稱 i 是穩定的。序列恰好有

Prufer Sequence +簡單排列組合bzoj 1005: [HNOI2008]明明的煩惱

1005: [HNOI2008]明明的煩惱 Description 自從明明學了樹的結構,就對奇怪的樹產生了興趣…給出標號為1到N的點,以及某些點最終的度數,允許在 任意兩點間連線,可產生多少棵度數滿足要求的樹? Input 第一行為N(0 < N < = 100

“東信杯”廣西大學第一屆程式設計競賽(同步賽) B 不吉利的數 規律 逆元 排列組合

傳送門:https://ac.nowcoder.com/acm/contest/283/B 題目描述  在 數學中,某個 序列的子序列是從最初序列通過去除某些元素但不破壞餘下元素的相對位置(在前或在後)而形成的新序列。

BZOJ1004Cards(組合數學,Burnside引理)

getchar 多次 等價 要求 std tdi cst 多少 存在 【BZOJ1004】Cards(組合數學,Burnside引理) 題面 Description   小春現在很清閑,面對書桌上的N張牌,他決定給每張染色,目前小春只有3種顏色:紅色,藍色,綠色.他詢問Su

NEUQ2083Travel(組合數學)

題目連結 2083: Travel 描述 題目描述: 魔方國有nn座城市,編號為1\sim n1∼n。城市之間通過n-1n−1條無向道路連線,形成一個樹形結構。 瀾瀾打算在魔方國進行mm次旅遊,每次遊覽至少一座城市。為了方便,每次旅遊遊覽的城市必須是連通的。此外,瀾

DFS排列問題

題目 輸出自然數 1 到 n 所有不重複的排列,即 n 的全排列,要求所產生的任一數字序列中不允許出現重複的數字。 輸入 n(1≤n≤9) 輸出 由 1~n 組成的所有不重複的數字序列,每行一個序列。 樣例輸入#1 3 樣例輸出#2 1 2 3 1 3 2

演算法求全排列 回溯 交換 DFS JAVA

思路簡述: 一個全排列其實就是一條把陣列無重複遍歷一遍的DFS過程 思路一:簡單回溯, 1. 一個List存遍歷路徑,從第N個“結點”到第N+1個“結點”是隻需要找一個未遍歷的結點就行 2. 一個關鍵點在於查詢 下一個可遍歷“結點”, 可以用SET輔助List存放已遍歷結點

CSS04:CSS組合選擇器

組合選擇器 群組(並集)選擇器 作用:給所有選擇器選中的標籤設定屬性,可以同時控制多個選擇器 格式: 選擇器1, 選擇器2 { 屬性: 值; } 注意點: 必須使用,來連線 選擇器可以使用標籤名稱、id名稱、類名稱 後代選擇器 作用:找到

AIX使用者、組合安全管理

使用者介紹 使用者的概述 比如:我們在使用AIX系統的時候,同事需要使用我的計算機,但是我不想讓他用我的使用者登入,我的使用者存在一些特殊資訊,只能自己檢視,此時就可以建立一個普通使用者給他使用即可。 1.單使用者多工 當我們使用root使用者登入進系統時候,我既啟動了Tomcat,同時也是用vi編輯器,這樣

java排列 列舉子集

全排列: 輸入一個包含n個字元的字串,輸出該字串的全排列。 樣例輸入: abc ab 樣例輸出: abc acb bac bca cab cba ab ba import java.util.Sca

BZOJ1072[SCOI2007]排列perm暴搜

似乎std是狀壓? 算了下O(Tn!)的確可以過,敲了一發,真過了... /* Footprints In The Blood Soaked Snow */ #include <cstdio&

Linux(Ubuntu)無法調節亮度的解決方案1(還原Fn組合鍵調節方法

原文:https://itsfoss.com/fix-brightness-ubuntu-1310/ 首先,確保你的膝上型電腦僅有Intel核心顯示卡 Step1 執行以下命令 ls /sys/class/backlight/ 如果是類似這樣,前面是筆記本品牌之類的代號,

luoguP1706排列問題

思路:最近發現自己對dfs的理解不夠深透於是寫了一個最基礎的dfs然後分析了一下QwQ#include<iostream> #include<cstdio> #include&

DFSDLUToj-1215-組合數字

題目描述:給出N個整數,每個數範圍在[-1000,1000],問能不能在N個數中選出一些數(但不可以不選,且每個數最多隻能被選擇一次),使他們的和為0 解題思路:OJ上竟然有人發郵件問我。。點開一看還是我沒做過的題。。一道DFS 好吧。。去敲了一下。顯然得剪枝一下才能過,

.NET繼承,組合,聚合詳解

類間關係   在類圖中,除了需要描述單獨的類的名稱、屬性和操作外,我們還需要描述類之間的聯絡,因為沒有類是單獨存在的,它們通常需要和別的類協作,創造比單獨工作更大的語義。在UML類圖中,關係用類框之間的連線來表示,連線上和連線端頭處的不同修飾符表示不同的關係。類之間的關係有

BZOJ 3505 [Cqoi2014]數三角形 容斥原理+排列組合+GCD

貢獻 def pri 組合 ans 矩形 排列組合 排列 ret 我們先把所有三角形用排列組合算出來,再把一行一列上的三點共線減去,然後我們只觀察向右上的三點共線,向左上的乘二即可,我們發現我們如果枚舉所有的兩邊點再乘中間點的個數(GCD),那麽我們發現所有的兩邊點都會形成

專題計數問題(排列組合,容斥原理,卡特蘭數)

spl 狀態 ans 補集 方便 常用 括號 inf 不存在 ---下面都是學習的筆記,還沒有整理,比較淩亂,有需自取吧。--- 【排列組合】 <加法原理>做一件事情有n個方法,第i個方法有pi種方案,則一共有p1+p2+...+pn種方案。 <乘法原理&

BZOJ4555: [Tjoi2016&Heoi2016]求和 排列組合+多項式求逆 或 斯特林數+NTT

oid int lan ret 多項式 algo com 題意 orm 【題意】給定n,求Σi=0~nΣj=1~i s(i,j)*2^j*j!,n<=10^5。 【算法】生成函數+排列組合+多項式求逆 【題解】參考: [BZOJ4555][Tjoi2016&H

BZOJ1008越獄(排列組合計數,容斥原理)

code typedef ostream ima bzoj1008 image sca fin space 題意: 思路: 1 #include<cstdio> 2 #include<cstdlib> 3 #include<ios