题目链接: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;
}