| ||||||||||
| 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 | |||||||||
这个题怎么剪枝呀 怎样去掉那些重复的状态#include <iostream.h>
#include <fstream.h>
int total,stick[200],n,flag;
int used[200];
int len;
int sift(int a[],int i,int n1)
{
int j,t;
j=2*i;
t=a[i];
while(j<=n1){
if (j<n1 && a[j]<a[j+1])
j++;
if (t<a[j]){
a[i]=a[j];
i=j;
j=2*i;
}
else break;
}
a[i]=t;
return 0;
}
int heap_sort(int a[],int n)
{
int i,t;
for(i=n/2;i>=1;i--)
sift(a,i,n);
for(i=n;i>=2;i--){
t=a[1];
a[1]=a[i];
a[i]=t;
sift(a,1,i-1);
}
return 0;
}
int search(int p,int now)
{
int i;
if (flag) return 0;
if (p==total && now==len){
flag=1;
return 0;
}
if (now==len){
p++;
now=0;
}
for(i=1;i<=n;i++){
if (used[i]==0 && (now+stick[i])<=len) {
used[i]=1;
if (!flag) search(p,now+stick[i]);
used[i]=0;
}
}
return 0;
}
int main()
{
int i;
int max,sum;
ifstream cin("input.dat");
while(cin>>n && n!=0){
sum=0;
max=0;
flag=0;
memset(used,0,sizeof(used));
for(i=1;i<=n;i++){
cin>>stick[i];
if (stick[i]>max) max=stick[i];
sum+=stick[i];
}
heap_sort(stick,n);
for(len=max;len<=sum;len++){
if (sum%len==0){
total=sum/len;
search(1,0);
}
if (flag) break;
}
cout<<len<<endl;
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator