天天看点

【算法练习】动态规划 01背包 Stone Pile把数组中的数分为两组使两组和相差最小

题目链接: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;
}