| ||||||||||
| 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 | |||||||||
不能搬1011的办法啊,那么大的规模肯定超时的In Reply To:类似的题目,我总是用回溯,结果总是 TLE,请教高手,应该怎么做 Posted by:IceAngel at 2005-05-27 11:34:51 > 类似的题目,我总是用回溯,结果总是 TLE,请教高手,应该怎么做。
>
> #include "iostream.h"
>
> #define max 6
>
> int graph[max];
> int map[max];
> int total; //总和,加权后
>
> bool check()
> {
> int i;
> int t = 0;
> for( i = 0 ; i < max ; i++ )
> t += ( i + 1 ) * map[i];
> if( t == total / 2 )
> return true;
> else
> return false;
> }
>
> int main()
> {
> int i;
> int sum; //个数
> bool flag;
> int top;
> int caseCount = 0;
>
> sum = 0;
> total = 0;
> for( i = 0 ; i < max ; i++ )
> {
> cin >> graph[i];
> sum += graph[i];
> total += ( i + 1 ) * graph[i];
> }
> while( sum > 0 )
> {
> caseCount++;
> cout<<"Collection #"<<caseCount<<":"<<endl;
> if( total % 2 == 0 )
> {
> for( i = 0 ; i < max ; i++ )
> map[i] = -1;
> top = 0;
> flag = false;//没有找到分法
> do
> {
> map[top]++;
> if( map[top] > graph[top] )
> {
> map[top] = -1;
> top--;
> }
> else
> {
> if( top == max - 1 )
> {
> if( check() )
> {
> cout<<"Can be divided."<<endl;
> flag = true;
> }
> }
> else
> {
> top++;
> }
> }
> }while( top >= 0 && !flag );
> if( !flag )
> cout<<"Can't be divided."<<endl;
> }
> else
> {
> cout<<"Can't be divided."<<endl;
> }
> cout<<endl;
> //==================================
> //下一循环
> sum = 0;
> total = 0;
> for( i = 0 ; i < max ; i++ )
> {
> cin >> graph[i];
> sum += graph[i];
> total += ( i + 1 ) * graph[i];
> }
> }
>
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator