题意:给你N种不同的设备,每种设备的价值为V,每种设备的数量为M,请尽量把他们分为总价值相近的两堆,为两堆的价值分别是多少,大的在前面输出。
分析:看到网上很多版本,可以用母函数、多重背包解决;在这里用了0-1背包解决。
实现:把总价值的一半看为背包容量,价值看为质量,价值也看为体积;最后可以求出接近总价值一半的价值,另一半就用总价值减去背包得出的一半的价值即可,注意背包求出的总价值的一般可能小于总价值减去背包求出的一半的价值。
#include<iostream> using namespace std; int value[5005]; int dp[250005]; int main() { int N,V,M; int sum,i,j,cnt; while(cin>>N && N>0) { for(i=0,sum=0,cnt=0;i<N;i++) { cin>>V>>M; while(M--) { value[cnt++]=V; sum+=V; } } memset(dp,0,sizeof(dp)); for(i=0;i<cnt;i++) for(j=sum/2;j>=value[i];j--) if(dp[j]<dp[j-value[i]]+value[i]) dp[j]=dp[j-value[i]]+value[i]; cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl; } return 0; }
时间: 2024-10-03 13:14:45