【uva307】小木棍 Sticks [dfs搜索]

我枯辽

开始这一段

if(cnt==m) return 1;
if(l==len) return dfs(cnt+1,0,1);

打成了

if(cnt==m) return 1;
if(l==len) dfs(cnt+1,0,1);

然后导致一直爆炸

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=100+5;
 4 bool v[N];
 5 int len,n,a[N],sum,m;
 6 template<class t>void rd(t &x)
 7 {
 8     x=0;int w=0;char ch=0;
 9     while(!isdigit(ch)) w|=ch==‘-‘,ch=getchar();
10     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
11     x=w?-x:x;
12 }
13 bool cmp(int a,int b) {return a>b;}
14
15 bool dfs(int cnt,int l,int last)
16 {
17     if(cnt==m) return 1;
18     if(l==len) return dfs(cnt+1,0,1);
19     int fail=0;
20     for(int i=last;i<=n;i++)
21     {
22         if(v[i]==0&&a[i]+l<=len&&fail!=a[i])
23         {
24             v[i]=1;
25             if(dfs(cnt,l+a[i],i)) return 1;
26             v[i]=0;fail=a[i];//回溯 当前长度失败了
27             if(l==0||l+a[i]==len) return 0;
28         }
29     }
30     return 0;
31 }
32
33 int main()
34 {
35     while(scanf("%d",&n)&&n)
36     {
37         sum=0;
38         for(int i=1;i<=n;i++) {rd(a[i]);sum+=a[i];}
39         sort(a+1,a+n+1,cmp);//排序
40         for(len=a[1];len<=(sum>>1);len++)
41         {
42              if(sum%len) continue;
43              m=sum/len;
44              memset(v,0,sizeof(v));
45              if(dfs(1,0,1)) {printf("%d\n",len); break;}
46         }
47         if(len>sum>>1) printf("%d\n",sum);
48     }
49         return 0;
50 }

100昏

原文地址:https://www.cnblogs.com/lxyyyy/p/10495015.html

时间: 2024-11-02 10:29:55

【uva307】小木棍 Sticks [dfs搜索]的相关文章

[UVA307]小木棍 Sticks

题目大意:有一堆小木棍,把它们接成相同长度的小木棍,问结果的小木棍的最小长度是多少,多组数据 题解:$dfs$,各种剪枝. 卡点:无 C++ Code: #include <cstdio> #include <algorithm> #include <cstdlib> #define maxn 55 const int inf = 0x3f3f3f3f; int n, Min, Max, sum; int cnt[maxn]; bool halt; void dfs(i

nyist oj 19 擅长排列的小明(dfs搜索+STL)

擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长.现在需要你写一个程序来验证擅长排列的小明到底对不对. 输入 第一行输入整数N(1<N<10)表示多少组测试数据, 每组测试数据第一行两个整数 n m (1<n<9,0<m<=n) 输出 在1-n中选

洛谷P1120小木棍[DFS]

题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度. 输入输出格式 输入格式: 输入文件共有二行. 第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤60 (管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!) 第二行为N个用空个隔开的正整数,表示N根小木棍的长度. 输出格式: 输出文件仅一行,表示要求

UVa307 Sticks (DFS+剪枝)

链接:http://vjudge.net/problem/19648 分析:这题重要的是剪枝.maxd表示的是最小可能长度(把砍完的木棍长度降序排好,最小可能长度大于等于砍完后最长的木棍长度,小于等于总长度的一半,且木棍的根数是整数,所以(总长度%每段最小可能长度=0)),dfs的三个状态分别为cur表示当前要凑maxd长度的木棍已经凑好的长度,from表示从砍完后的第from根木棍开始考虑,cnt表示已经凑好maxd长度木棍的根数. 1.将所有木棍按长度从大到小排序,dfs组合木棍时优先使用长

【搜索】小木棍

[搜索]小木棍 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度. 输入 共有二行. 第一行为一个单独的整数N表示看过以后的小木柜的总数,其中N≤60,第二行为N个用空个隔开的正整数,表示N跟小木棍的长度. 输出 仅一行,表示要求的原始木棍的最小可能长度. 样例输入 9 5 2 1 5 2 1 5 2 1 样例输出

poj-1011 sticks(搜索题)

George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Please h

P1120 小木棍 [数据加强版]

题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度. 输入输出格式 输入格式: 输入文件共有二行. 第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65 (管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!) 第二行为N个用空个隔开的正整数,表示N根小木棍的长度. 输出格式: 输出文件仅一行,表示要求

洛谷P1120 小木棍

洛谷1120 小木棍 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50.     现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度.     给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度. 输入输出格式 输入格式: 输入文件共有二行. 第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤60 (管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!) 第二行为N个用空个隔开的正整数,表示N根小木棍的长度.

luogu P1120 小木棍 [数据加强版]

二次联通门 : luogu P1120 小木棍 [数据加强版] /* luogu P1120 小木棍 [数据加强版] 暴搜 + 剪枝 枚举可能的长度 挨个检查答案 二分显然正确性不能保障 搜索时从最大的开始找 放上当前木棍后的长度比枚举的长度要大, 则退出 若当前的长度与当前扫到的木棍长度相同, 或是还需要的长度与枚举的长度相同,则退出 若当前的木棍不符合要求, 则后面与它长度相同的木棍都不行 */ #include <algorithm> #include <iostream>