UVa 307 Sticks(暴力 剪枝)

2021-06-28 15:46:35 字數 540 閱讀 9512

給出一些木棍的長度,把這些木棍拼成長度相同的長木棍,求最短的長度。

首先對所有木棍進行降序排序,然後開始列舉,列舉下界是小木棍長度的最大值,上界是小木棍長度之和的一半。

在列舉的過程中必須進行剪枝,否則會超時。

1、當前列舉的長木棍長度不是小木棍長的和的因數時跳過。

2、與當前小木棍長度相同的小木棍沒有使用,當前小木棍也不會使用。

3、當前是拼新的長木棍的第乙個小木棍,而最後無法拼成的,直接回溯。

4、一根木棍補足長木棍剩餘所需長度,而最後無法拼成的,直接回溯。

#include#include#includeusing namespace std;

const int maxn=1010;

int a[maxn],n,len,num;

bool vis[maxn];

bool cmp(int a,int b)

bool dfs(int l,int cur,int cnt){

if(cnt==num) return true;

for(int i=cur;i

紫書刷題 UVA 712 S樹 S Trees

題目 我想用題目中給出的第二組輸入為例。3 x3 x1 x2 00010011 4000 010111 110000可以看做二進位制數000,可以轉化為十進位制的0,00010011中的第0位就是答案0 010可以看做二進位制數001,可以轉化為十進位制的1,00010011中的第1位就是答案0 1...