两个海盗让你分金币,如果他们两个分到的金币差的绝对值不是最小的他们就会杀了你。
改变思路,假设金币总和为sum,相当于你拥有sum/2的背包,求最大价值,然后就变成了最简单的01背包了。
AC代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#define bll __int128
using namespace std;
int dp[66000],p[233];
int main(){
int T,n,sum,v;
cin>>T;
while(T--){
cin>>n;
memset(dp,0,sizeof(dp));
memset(p,0,sizeof(p));
sum = 0;
for(int i=1;i<=n;++i){
cin>>p[i];
sum += p[i];
}
v = sum/2;
for(int i=1;i<=n;++i){
for(int j=v;j>=p[i];--j)
dp[j] = max(dp[j],dp[j-p[i]]+p[i]);
}
cout<<sum-2*dp[v]<<endl;
}
return 0;
}