| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:那位大牛谁能找出错啊……………………万谢!!In Reply To:那位大牛谁能找出错啊……………………万谢!! Posted by:pkusirius at 2010-02-06 19:43:11 > #include<iostream>
> #include<stdlib.h>
> #include<memory.h>
> using namespace std;
> int n;
> int stick[65];
> int len;
> int sumlen=0;
> bool used[65];
> int nLastStickNo=0;
> bool DFS(int UnusedStick ,int left )
> {
> if(UnusedStick==0&&left==0)
> return true;
> if(left==0)
> left=len;
> int nStartNo = 0;
> if( left != len) //剪枝
> nStartNo = nLastStickNo + 1;
>
> for(int i = nStartNo;i < n;i ++)
> {
> if(!used[i]&&stick[i]<=left)
> {
> if(i>0)
> {
> if(used[i-1]==0&&stick[i]==stick[i-1])
> continue;
> }
> used[i]=true;
> nLastStickNo = i;
> if(DFS(UnusedStick-1,left-stick[i]))
> return true;
> else
> {
> used[i]=false;
> if(stick[i]==left||left==len)//剪枝
> return false;
> }
> }
> }
> return false;
> }
>
> int compare(const void*x,const void *y)
> {
> return *(int*)y- *(int*)x;
> }
>
> int main()
> {
> while(true)
> {
> cin>>n;
> if(n==0)
> break;
> int i,j;
> for(i=0;i<n;i++)
> {
> cin>>stick[i];
> sumlen+=stick[i];
> }
> qsort(stick,n,sizeof(int),compare);
>
> if(stick[0]>(sumlen/2))
> cout<<sumlen<<endl;//一个优化
>
> for(len=stick[0];len<=sumlen/2;len++)
> {
> if(sumlen%len)
> continue;
> memset( used, 0,sizeof(used));
> if(DFS(n,len))
> {
> cout<<len<<endl;
> break;
> }
>
> }
> memset(stick,0,sizeof(stick));
> sumlen=0;
> memset( used, 0,sizeof(used));
> len=0;
> }
> return 0;
> }
我把已知的数据都测试了……没有问题
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator