POJ-1014-Dividing

#include <stdio.h>

int marbles[6]; 

int split(int num);

int
main()
{
	int i,t,c,sum;
	
	c = 1;
	while(1) {
		sum = 0;
		for(i=0; i<6; i++) {
			scanf("%d", &marbles[i]);
			sum += marbles[i] * (i+1);
		}
		
		if(sum == 0)
			break;
			
		printf("Collection #%d:\n", c++);
		
		if(sum % 2 == 1) {
			printf("Can't be divided.\n\n");
			continue;
		}
			
		if(split(sum / 2)) {
			printf("Can be divided.\n\n");
		} else {
			printf("Can't be divided.\n\n");
		}
	}

	return 0;
}

int
split(int num)
{
	int i,ret;
	
	if(num == 0) {
		return 1;
	} else {
		for(i=5; i>=0; i--) { // 先试大的效率高 
			if(num >= i+1 && marbles[i]) {
				marbles[i]--;
				ret = split(num - i - 1);
				marbles[i]++;
				
				if(ret)
					return ret;
					
				// 一次不行,这个数就不用再试了 
				marbles[i] = 0; 
			}
		}
		
		return 0;
	}
}

posted @ 2011-02-05 21:14  Faircoala  阅读(234)  评论(0编辑  收藏  举报