| ||||||||||
| 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>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <stack>
#include <map>
#include <functional>
#define REP(i,n) for(i=0;i<n;i++)
using namespace std;
map<int,int,greater<int> > mp;
int g;
stack<int> stk;
void factor(vector<int> &a , int n , int min)
{
int i;
for ( i = min ; i <= n/2 ; i++)
{
if( n%i == 0 ) a.push_back(i);
}
a.push_back(n);
}
bool dfs(int goal,int m)
{
bool flag;
map<int, int,greater<int> >::iterator ite;
if( goal == 0 )
{
//搜索完成
if( m == 1 ) return true;
else{ //深入
m--;
goal = g ;
flag = dfs(goal,m);
if(flag) return true;
else
return false;
}
}
else
{
if( !stk.empty() && goal != g )
ite = mp.find(stk.top());
else
ite = mp.begin();
for (; ite != mp.end() ; ite++)
{
//对每个数据进行判断。
if( goal >= ite->first && ite->second > 0 )
{
//可用
ite->second--;
stk.push(ite->first);
if(dfs(goal-ite->first,m)) return true;
else
{
ite->second++;
stk.pop();
//top--;
if( goal == g ) return false;
}
}
}
return false;
}
}
int main()
{
int goal,i,t,n,m,x,sum;
map<int,int,greater<int> > temp;
vector<int> a;
cin>>n;
while ( n != 0 )
{
//sum存储所有数据和,mp存储各数据及其出现次数,按大到小保存,a保存候选数据goal
a.clear();
mp.clear();
sum = 0 ;
REP(i,n)
{
cin>>t;
sum += t;
mp[t]++;
}
factor(a,sum,mp.begin()->first);
temp = mp;
REP(i,a.size()-1)
{
//最后一个为和,数据中每个为候选数据
m = sum/a[i];
goal = a[i];
g = goal;
//需要m次为a[i]长度的木棍
if(dfs(goal,m)) //搜索成功
{
cout<<a[i]<<endl;
break;
}
//回复map
mp = temp;
}
if( i == a.size()-1 ) cout<<a[a.size()-1]<<endl;
cin>>n;
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator