枚举搜索。当然用动态规划是最好的了。
我的搜索办法是,先将所有石子放在一起,然后满堆和空堆的差就是石子总质量。接下来就一种状态一种状态搜索,每次搜索到把一个石子从原来那个堆移动到另一个堆以后,满堆和空堆的差就减去这个石子重量的2倍。搜索完毕,取最小的那个差值即可。
我的搜索办法是,先将所有石子放在一起,然后满堆和空堆的差就是石子总质量。接下来就一种状态一种状态搜索,每次搜索到把一个石子从原来那个堆移动到另一个堆以后,满堆和空堆的差就减去这个石子重量的2倍。搜索完毕,取最小的那个差值即可。
#include<iostream>
using namespace std;
const int MAX = 20;
void Stone(int current,int index);
int t;
long Stones[MAX],MinDiff;
int main()
{
int c1,sum;
while(cin>>t)
{
sum=0;
for(c1=0;c1<t;c1++)
{
cin>>Stones[c1];
sum+=Stones[c1];
}
MinDiff=sum;
Stone(sum,0);
cout<<MinDiff<<endl;
}
return 0;
}
void Stone(int current,int index)
{
if(current<MinDiff) MinDiff=current;
if(t==index) return;
Stone(current,index+1);
if(current-2*Stones[index] >= 0) Stone(current-2*Stones[index],index+1);
}
using namespace std;
const int MAX = 20;
void Stone(int current,int index);
int t;
long Stones[MAX],MinDiff;
int main()
{
int c1,sum;
while(cin>>t)
{
sum=0;
for(c1=0;c1<t;c1++)
{
cin>>Stones[c1];
sum+=Stones[c1];
}
MinDiff=sum;
Stone(sum,0);
cout<<MinDiff<<endl;
}
return 0;
}
void Stone(int current,int index)
{
if(current<MinDiff) MinDiff=current;
if(t==index) return;
Stone(current,index+1);
if(current-2*Stones[index] >= 0) Stone(current-2*Stones[index],index+1);
}