题目链接:https://acm.timus.ru/problem.aspx?space=1&num=1005
参考链接:面试题:把数组中的数分为两组,使得两组和相差最小 timus 1005. Stone Pile https://blog.csdn.net/pegasuswang_/article/details/25081783
这个转换成01背包是我没想到的!
不得不说这个思路是怎么想到的好厉害子
问题等价于-> 背包容量为sum/2 物品价值就是物品重量 求在这个背包容量下物品重量的最大值
这样就能求出一组的选择使得选择的物品重量尽量接近sum/2 ,剩下一组的物品重量也就可以得到,就得到的两组和的差。
代码:
//题目链接
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n,sum=0;
int w[30];
cin>>n;
for(int i=0;i<n;i++){
cin>>w[i];
sum+=w[i];
}
vector<int> dp(sum+1,0);
for(int i=0;i<n;i++){
for(int j=sum/2;j-w[i]>=0;j--){
if(dp[j-w[i]]+w[i]>dp[j])
dp[j]=dp[j-w[i]]+w[i];
}
}
int res=sum-dp[sum/2]-dp[sum/2];
cout<<res;
return 0;
}