PKU ACM 1014 Dividing 平分 (DFS)

题目链接:Dividing

 

问题描述:

两个人平分物品,每件物品的价值不同(1 ~ 6),但多件物体可以有相同的价值。问是否可以平分。

 

主要思路:

1. 递归求解;

2. 两个重要的剪枝:

    (1) 若总价值为奇数,则必不可分;

    (2) 在递归的过程中,若当前目标价值为奇数,但价值为奇数的物体已用尽,则无解;

3. 此题也可用动态规划的方法解决,可参考动态规划解法

 

源代码:

#include <iostream>
using namespace std;

int marbles[6];
int sum;
int target;

bool Candivide(int cur)
{
	if(((target - cur) % 2 != 0) && (marbles[0] == 0) 
		&& (marbles[2] == 0) && (marbles[4] == 0))	//重要剪枝
		return false;

	for(int i = 5; i >= 0; i--)
	{
		if(marbles[i] > 0)
		{
			if(cur + i + 1 == target)
				return true;
			if(cur + i + 1 < target)
			{
				cur = cur + i + 1;
				marbles[i]--;
				if(Candivide(cur))
				{
					return true;
				}
				else
				{
					cur = cur - i - 1;
					marbles[i]++;
				}

			}
		}
	}
	return false;
}

int main()
{
	int index = 1;
	while(true)
	{
		sum = 0;
		target = 0;
		memset(marbles, 0, sizeof(marbles));
		for(int i = 0; i < 6; i++)
		{
			cin >> marbles[i];
			sum += marbles[i] * (i + 1);
		}

		if(sum == 0)	break;
		if(sum % 2 != 0)
		{
			cout << "Collection #" << index << ":" << endl;
			cout << "Can't be divided." << endl << endl;
			index++;
			continue;
		}

		target = sum / 2;
		if(Candivide(0))
		{
			cout << "Collection #" << index << ":" << endl;
			cout << "Can be divided." << endl << endl;
		}
		else
		{
			cout << "Collection #" << index << ":" << endl;
			cout << "Can't be divided." << endl << endl;
		}
		index++;
	}

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值