| ||||||||||
| 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 | |||||||||
请高手帮忙看看。我参考解题报告上的方法。但是就这样Wa了。。。。#include <iostream.h>
#include <memory.h>
#include <algorithm>
using namespace std;
int i,used[200],list[200],t,now,k,ed,n,total,co;
int thsort()
{
int a,b,c;
for (a=1;a<=n;a++)
for (b=1;b<=n-1;b++)
if (list[b]<list[b+1])
{
c=list[b];
list[b]=list[b+1];
list[b+1]=c;
}
return 0;
}
bool solve(int k, int i, int now, int or) //k:木棍应该长度 i:当前的号数。 now:正在组装的木棍长度. or:正在组装第or根木棍。
{
int t1,t2;
if ((now==k)&&(or==ed)) return true;
if (now==k)
{
t2=solve(k,0,0,or+1);
return t2;
}
if (now==0)
{
for (t1=1;t1<=n&&used[t1]==1;t1++);
used[t1]=1;
t2=solve(k,t1,list[t1],or);
return t2;
}
for (t1=i+1;t1<=n;t1++)
if ((used[t1]==0)&&(list[t1]+now<=k))
{
if (list[t1]==k-now)
{
used[t1]=1;
t2=solve(k,t1,k,or);
return t2;
}//这个if 是参考的解题报告的第三条优化:如果当前的长度刚好可以把木棍未填的填上,则填上。但是加上这个剪枝条件,则Wa,不加又memory limit exccedded.
used[t1]=1;
t2=solve(k,t1,now+list[t1],or);
if (t2) return true;
used[t1]=0;
}
return false;
}
bool de(int a,int b) {return bool(a-b);}
int main()
{
while (cin>>n&&n>0)
{
total=0;
for (i=1;i<=n;i++) {cin>>list[i]; total+=list[i]; }
thsort();
// sort(list+1,list+n+1, de);
k=list[1]; t=false;
do
{
co=0;
memset(used,0,sizeof(used));
ed=total/k;
if (total%k==0) t=solve(k,0,0,1);
k++;
} while(!t);
k--;
if (t) cout<<k<<endl; else cout<<total<<endl;
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator