一开始的思路是分别求两个人背的石头,然后让差最小,然后发现很难写出来;上网看了题解毛色顿开,这还是一个0-1背包问题。只要求哥哥背的,最后用总共的减掉哥哥的就是弟弟背的;
因为x<=y,所以哥哥要背的不超过sum/2但是接近一半。我们只需要把哥哥的0-1背包的最大容量设为sum/2即可
做的时候出现了多次运行错误,最终发现是f[]数组应该开大一些,注意这些小细节!
egmentation fault
: 段错误,检查是否有数组越界,指针异常,访问到不应该访问的内存区域。
上代码!
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1010;
int a[N];
int f1[10000010];//key
int n;
//然后就相当于求一个容积为总重量的一半的背包问题
int main()
{
while(~scanf("%d",&n))
{
int sum=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
int k=sum/2;
for(int i=1;i<=n;i++)
{
for(int j=k;j>=a[i];j--)//key
{
f1[j]=max(f1[j-a[i]]+a[i],f1[j]);
}
}
cout<<f1[k]<<" "<<sum-f1[k]<<endl;
}
return 0;
}