HDU 1455 Sticks
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; }