摩拜单车2019春招笔试题

有n堆石头,现在请将它们分成两堆,并要求两堆的重量和尽可能接近,输出两堆石头的重量和,结果按降序排列。

算法:动态规划

#include<iostream>
#include<algorithm>
#include<vector>
#include<limits.h>
using namespace std;
int main(void){
    int n,sum=0;
    cin>>n;
    vector<int>f(n);
    for(int i=0;i<n;i++){
        cin>>f[i];
        sum+=f[i];
    }
    int m=sum/2;
    vector<int>dp(m+1,0);
    dp[0]=0;
    for(int i=0;i<n;i++)
        for(int j=m;j>=f[i];j--){
            dp[j]=max(dp[j],dp[j-f[i]]+f[i]);
    }
    int ans=abs(dp[0]-sum),k=0;
    for(int i=1;i<=m;i++){
        if(ans>abs(dp[i]-sum)){
            ans=abs(dp[i]-sum);
            k=i;
        }
    }
    if(sum-dp[k]<=dp[k])cout<<dp[k]<<' '<<sum-dp[k]<<endl;
    else cout<<sum-dp[k]<<' '<<dp[k]<<endl;
    return 0;
}

 

posted @ 2019-07-08 22:28  YF-1994  阅读(335)  评论(0编辑  收藏  举报