描述
喬治拿來一組等長的木棒,將它們隨機地裁斷,使得每一節木棍的長度都不超過50個長度單位。然後他又想把這些木棍恢復到為裁截前的狀態,但忘記了初始時有多少木棒以及木棒的初始長度。請你設計乙個程式,幫助喬治計算木棒的可能最小長度。每一節木棍的長度都用大於零的整數表示。
輸入
輸入包含多組資料,每組資料報括兩行。第一行是乙個不超過64的整數,表示砍斷之後共有多少節木棍。第二行是截斷以後,所得到的各節木棍的長度。在最後一組資料之後,是乙個零。
輸出
為每組資料,分別輸出原始木棒的可能最小長度,每組資料佔一行。
樣例輸入
9
5 2 1 5 2 1 5 2 1
41 2 3 4
0
樣例輸出
6
5
#include #include #include using namespace std;
bool isend=false;
int len=1;
vectora(64);
vectorvisit(64);
int num;
//used_num為當前已被用過的小棒數,now_index為當前要處理的小棒。
void dfs(int used_num,int now_len,int now_index)
if(now_len==len)else
return;
}if(now_len==0)else
int main()
isend=false;
int sum=0;
int max=0;
for(int i=0;i>a[i];
sum+=a[i];
if(a[i]>max)
}sort(a.begin(),a.end(),cmp);
for(len=max;len問題描述:給出4個1-10的數字,通過加減乘除,得到數字為24就算勝利
輸入:4個1-10的數字。[數字允許重複,但每個數字僅允許使用一次,測試用例保證無異常數字]
輸出:true or false
輸入4個int整數
返回能否得到24點,能輸出true,不能輸出false
示例1複製
7 2 1 10複製
true
#include#include#include #include using namespace std;int dfs(vectornum,vectorflag,int sum)
for(int i=0;i<4;i++)
if(dfs(num,flag,sum-num[i])==1)
if(dfs(num,flag,sum*num[i])==1)
if(num[i]!=0&&dfs(num,flag,sum/num[i])==1&& sum % num[i]==0)
flag[i]=0;}}
return 0;
}int main()
return 0;
}
307 Sticks( )經典DFS 剪枝
題意 長度相同的木棒被分成許多段,求木棒原來狀態的最短長度 此題重在剪枝,主要剪枝思路有 使用陣列a儲存被分解成的各個部分的長度,木棒的每段被稱之為s 搜尋範圍從max到sum,且必須能被sum整除 為避免重複,組合成木棒的s從大到小排序,每根木棒的第乙個s,也要求從大到小排序 在某層搜尋中,如果a...
搜尋剪枝DFS
tempter of the bone hdu1010 題意 給乙個圖,找出乙個看能否能在t的時間內從s到達d點 思路 bfs肯定不行,因為bfs找到的是最短時間的路徑,無法對在t時間點到達d點進行判斷 於是才想到了dfs,這個能把所有的情況遍歷一遍的演算法,雖然圖的長寬只有7,但是總是超時,這次終...
DFS搜尋 剪枝
hdu 5952 題意 給出一張無向圖,然後判斷這張圖中一共有多少個不同的大小為s的完全圖 完全圖的頂點數為s個 題目保證每個點的度不大於20。完全圖 n個點兩兩之間都有一條邊的圖叫完全圖。思路 由於頂點個數很少,而且每個點的度數最多是20,所以可以暴力優化,建圖,對於每個s點完全子圖,如果i點在子...