どこでもドア:传送门
一个裸的0-1背包问题,可以参考《算法竞赛入门经典》。
这里使用滚动数组的方法。
code
#include<bits/stdc++.h>
using namespace std;
int dp[102411];
int main()
{
int n,ma[55],sum=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>ma[i];
ma[i]/=1024;
sum+=ma[i];
}
int mid = sum/2;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
for(int j=mid;j>=0;j--){
if(j>=ma[i])
dp[j]=max(dp[j],dp[j-ma[i]]+ma[i]);
}
}
cout<<(sum-dp[mid])*1024<<endl;
return 0;
}