POJ 1416 DFS 加簡單剪枝

2021-06-20 19:26:42 字數 1077 閱讀 2620

剪枝的條件很明確,如果現在的 前面已經斷開的紙帶的和與當前紙帶的和大於目標值,就不用向下搜尋了。

注意乙個細節是,第乙個只能加到當前紙帶上

其實這種題還是乙個表示狀態的問題

dfs(sum,cur,p)

表示前面的和 當前紙帶的和 當前走到了第幾個

這樣足夠清晰的描述問題了

#include #include #include #include #include #include #include #include using namespace std;

#define read freopen("acm.in","r",stdin)

#define ll long long

#define pii pair#define pdi pair#define mpi map::iterator

#define fst first

#define sec second

#define ms(x,d) memset(x,d,sizeof(x))

#define inf 0x3f3f3f3f

#define all(x) x.begin(),x.end()

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define max 5500

#define root 0,n-1,1

#define pb push_back

#define for(a,b,c) for(int a=b;atar)

return ;

if(p==n)

else if(sum>tmp&&sum<=tar)

int main()

{ while(scanf("%d%s",&tar,num))

{if(tar==0&&num[0]=='0')

return 0;

tmp=0,cnt=0;

top=0;

n=strlen(num);

if(!check())

{cout<<"error"<1)

{cout<<"rejected"<

POJ1416 切割紙條 DFS 剪枝

這題目個人感覺有點難,很難抽象出具體的搜尋模型,看了別人的解題報告才有思路。切割乙個資料即切割紙條,相加的和最接近給出目標的值。比如,12346是資料,target的值是50,應該把數字切成四部分,分別是1 2 34 6。因為這樣所得到的和43 1 2 34 6 是所有可能中最接近而不超過50的。碎...

poj1416 簡單dfs列舉題

這題沒啥好說的,就是將字串num分割成好幾個整數,並相加起來,看看哪種分割情況的和是最接近 t 的 因為每個num最多只有6位,所以總共的分割情況也就32種,非常簡單,只要能寫出dfs函式就可以了 include includeusing namespace std int t,flag,k,ans...

POJ 生日蛋糕 DFS 剪枝

題目鏈結 題目大意 乙個多層生日蛋糕。要求下面一層一定要比上面的一層大而且高,求符合該條件的蛋糕,其中最小的表面積 解題思路 要求出最小表面積且下面的要比上面的大,所以每一層的半徑和高度最小值為該層的層數 從上到下數的層數 這樣一一枚舉每層的半徑和高度。但是由於情況太多,所以需要剪枝來降低搜尋的次數...