Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 43674 | Accepted: 10841 |
Description
Input
Output
Sample Input
1 0 1 2 0 0 1 0 0 0 1 1 0 0 0 0 0 0
Sample Output
Collection #1: Can't be divided. Collection #2: Can be divided.
题意很简单,就是有一组大理石,即每一行输入。行的列号位大理石的价值,值为大理石的数目。如1 0 1 2 0 0即价值为1的大理石有1个,价值为2的有0个,价值为3的有1个,以此类推。判断是否有一种分法,使得Marsha和Bill得到的大理石价值相等,即平分大理石。
也是搜索的题目,首先如果大理石价值本身不为偶数,当然不能平分;进入搜索,剪掉所有组合值会大于总价值一半的枝,当搜索到的组合恰好等于总价值的一半时,搜索成功!
与1010思路差不多。
被一位同学指出了问题,说 0 0 0 6 2 2不能给出正确的切分答案。看了一下,确实是回溯的时候有点问题。改后的代码如下:
using namespace std;
int marble[6];
int found;
int targetNum,i;
void calculate(int currentNum,int i)
{
if(currentNum*2==targetNum)
{
found=1;
return;
}
for(int k=i;k>=0;k--)
{
if(marble[k])
{
if(k+1+currentNum<=targetNum/2)
{
marble[k]--;
calculate((k+1)+currentNum,k);
if(found)
{
break;
}
marble[k]++;
}
}
}
}
void init()
{
int index=0;
while(cin>>marble[0]>>marble[1]>>marble[2]>>marble[3]>>marble[4]>>marble[5])
{
found=0;
targetNum=0;
for(i=0;i<6;i++)
{
targetNum+=(i+1)*marble[i];
}
if(targetNum==0)
{
break;
}
if(targetNum%2!=0)
{
found=0;
}
else
{
calculate(0,5);
}
if(found)
{
cout<<"Collection #"<<++index<<":"<