| ||||||||||
| 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 <stdlib.h>
#include <memory.h>
#define maxn 70
bool used[maxn];
int p[maxn];
int len,n,count = 0;
int compare(const void *a,const void *b){
return (*(int *)a)-(*(int *)b);
}
bool f1(int k);
bool f2(int kk,int pos,int left);
void main(){
int i = 0;
int sum = 0;
while(cin>>n&&n){
sum = 0;
for(i = 1;i<=n;i++){
cin>>p[i];
sum+= *(p+i);
}
qsort(p+1,n,sizeof(int),compare);
//for(i = 1;i<=n;i++){
// cout<<p[i]<<" ";
//}cout<<endl;
len = p[n];
for(;len<=sum;len++){
if(sum%len)continue;
memset(used,false,maxn);
count = sum/len;
if(f1(1))break;
}
if(len>sum)cout<<sum<<endl;
else cout<<len<<endl;
}
}
bool f1(int k){
// cout<<"f1 = "<<k<<endl;
if(k==count)
{
//cout<<" len = "<<len<<" 搜索成功!!\n";
return true;
}
else
{
int i = 0;
for(i=n;i>=1;i--){
if(!used[i])break;
}
used[i] = 1;
if(f2(k,i,len-p[i])){f1(k+1);return true;}
else
{//cout<<" len = "<<len<<" 搜索失败!!\n";
return false;
}
}
}
bool f2(int kk,int pos,int left)
{ //cout<<"f2: kk = "<<kk<<", pos = "<<pos<<", left = "<<left<<endl;
if(left == 0)
{
if(f1(kk+1))return true;
}
else if(pos<=1){return false;}
else{
int i = 0;
for(i = pos-1;i>=1;i--){
if(!used[i]&&p[i]<=left)
{
used[i] = true;
if(f2(kk,i,left-p[i])) return true;
else{
used[i] = false;
while((i-1)&&p[i-1]==p[i])i--;
}
}
}
return false;
}
}
Followed by:
Post your reply here: |