| ||||||||||
| 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 | |||||||||
第一次来poj 做这个题目 试了一下讨论区里面的数据 都能过 也不会超时 但提交就是runtime error 有人知道为什么吗?代码:
写得比较丑陋 大家别笑我
//sticks
//#include "stdafx.h"
#include <iostream>
//#include <fstream>
using namespace std;
const int maxlen=50;
const int maxn=64;
struct node
{
int qtt,last,now;
};
void sort(int* a,int n)
{
for (int i=0;i<n-1;i++)
for (int j=i+1;j<n;j++)
if (a[i]<a[j])
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
bool check(int* num,int left,int des,int* make)
{
int n=left;
int a[maxn];
for (int i=0;i<n;i++)
{
a[i]=num[i];
}
node pkg[maxlen*maxn+1];
for (int i=1;i<=des;i++)
pkg[i].qtt=-1;
pkg[0].qtt=0;
for (int i=0;i<n;i++)
{
for (int j=des-a[i];j>=0;j--)
{
if (pkg[j].qtt!=-1)
{
if (pkg[j+a[i]].qtt==-1)
{
pkg[j+a[i]].qtt=pkg[j].qtt+1;
pkg[j+a[i]].last=j;
pkg[j+a[i]].now=a[i];
continue;
}
if (pkg[j+a[i]].qtt>pkg[j].qtt+1)
{
pkg[j+a[i]].qtt=pkg[j].qtt+1;
pkg[j+a[i]].last=j;
pkg[j+a[i]].now=a[i];
}
}
}
}
int amt=0;
if (pkg[des].qtt!=-1)
{
int pos=des;
while (pos!=0)
{
make[amt]=pkg[pos].now;
amt++;
pos=pkg[pos].last;
}
}
else return false;
return true;
}
void dfs(int* num,int left,int des,int* list,int& t,int*temp,bool* used,int l,int now,int start)
{
int pre=-1;
for (int i=start;i<left;i++)
{
if ((used[i]) || (pre==num[i]) || (now+num[i]>des)) continue;
now+=num[i];
pre=num[i];
used[i]=true;
l++;
temp[l]=num[i];
if (now==des)
{
list[t]=l;
for (int j=1;j<=l;j++)
list[t+j]=temp[j];
t+=l+1;
}
else dfs(num,left,des,list,t,temp,used,l,now,i);
now-=num[i];
used[i]=false;
l--;
}
}
bool calc(int* num,int left,int des)
{
int n=left;
if (n==0) return true;
else
{
int make[maxn];
bool chk=check(num,left,des,make);
if (!chk) return false;
else
{
int a[maxn];
bool used[maxn];
int temp[maxn];
int t=0;
for (int i=0;i<n;i++)
{
a[i]=num[i];
used[i]=false;
}
int list[maxn*maxlen];
for (int i=0;i<maxn*maxlen;i++)
list[i]=-1;
dfs(a,left,des,list,t,temp,used,0,0,0);
int pos=0;
while (list[pos]!=-1)
{
int a[maxn];
for (int i=0;i<n;i++)
{
a[i]=num[i];
}
for (int i=1;i<=list[pos];i++)
{
for (int j=0;j<left;j++)
if (list[pos+i]==a[j])
{
a[j]=0;
break;
}
}
int new_left=0;
int b[maxn];
for (int i=0;i<n;i++)
if (a[i]!=0)
{
b[new_left]=a[i];
new_left++;
}
return calc(b,new_left,des);
pos+=list[pos]+1;
}
}
}
}
int main()
{
//ifstream inf("input.txt");
int answer[maxn];
int tt=0;
do
{
int n;
cin>>n;
if (n==0) break;
int a[maxn];
int total=0;
for (int i=0;i<n;i++)
{
cin>>a[i];
total+=a[i];
}
sort(a,n);
bool find=false;
for (int ys=a[0];ys<=total/2;ys++)
{
if (total%ys==0)
{
if (calc(a,n,ys))
{
answer[tt]=ys;
tt++;
find=true;
break;
}
}
}
if (!find)
{
answer[tt]=total;
tt++;
}
}
while (true);
for (int i=0;i<tt;i++)
cout<<answer[i]<<endl;
//inf.close();
//system("pause");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator