http://acm.hdu.edu.cn/showproblem.php?pid=1455
题意大概就是:有一堆的木棒,长度不一,它们是有一些整齐的木棒截断而成的,求最小的整齐长度。
额,这道题目第一次做的时候是在集训前一天。那时候默默的用了自己学过的为数不多的算法:贪心去做了这题。不出意外的WA了。
囧了。
过了10几天后的今天突然又去看了这题,突然觉得可以使用这几天在学的搜索来做。然后,果断的敲了一个DFS,,还是WA了,那时候感觉自己做的没错,然后就去请教队长,队长让我去和那些AC的代码数据对拍,结果。果然发现了自己的错误。唉,对于DFS的掌握不够啊,忘记恢复vis了。
人生当中第二道DFS题啊
囧
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef long long LL;
#define MIN(a,b) (a > b ? b : a)
int N,cnt,flag,V,ok;
int aa[100],ans[100],vis[100];
int cmp(int a,int b)
{
return a > b ;
}
int get(int x)
{
int c = 0;
for (int i=1;i<=x;i++)
if (x % i == 0)ans[c++] = i;
return c;
}
void show()
{
for (int i=0;i<N;i++)
printf("%d ",aa[i]);
printf("\n");
}
void DFS(int v,int t,int sum)
{
if (sum == 0){flag = 1;return ;}
for (int i=t;i<N && !flag;i++)
{
if (v - aa[i] >= 0 && vis[i] == 0)
{
vis[i] = 1;
if (v == aa[i])DFS(V,0,sum-aa[i]);
else DFS(v-aa[i],i+1,sum-aa[i]);
vis[i] = 0;
if (v == aa[i] || v == V)return ;
while (aa[i] == aa[i+1])i++;
}
}
}
int main()
{
int cc = 1;
while (scanf("%d",&N) && N)
{
int sum = 0;
memset(aa,0,sizeof(aa));
for (int i=0;i<N;i++)
{
scanf("%d",&aa[i]);
sum += aa[i];
}
int m = get(sum);
sort(aa,aa+N,cmp);
// show();
for (int i=0;i<m;i++)
{
if (aa[0] > ans[i])continue ;
memset(vis,0,sizeof(vis));
V = ans[i];
flag = 0;
DFS(ans[i],0,sum);
if (flag )
{
printf("%d\n",ans[i]);
break ;
}
}
}
return 0;
}