摩拜单车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; }