K题 多重背包
来源:互联网 发布:js点击空白处隐藏 编辑:程序博客网 时间:2024/04/30 10:46
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define MAX 300000 int dp[MAX],v[1000],m[1000]; int main() { int i,j,n,k; while(cin>>n&&n>=0) { int sum=0; for(i=1;i<=n;i++) { cin>>v[i]>>m[i]; sum+=v[i]*m[i]; } memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) for(j=1;j<=m[i];j++) { for(k=sum/2;k>=v[i]*j;k--) { if(dp[k]<dp[k-v[i]]+v[i]) dp[k]=dp[k-v[i]]+v[i]; // cout<<dp[k]<<endl; } } if(sum-dp[sum/2]>dp[sum/2]) cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl; else cout<<dp[sum/2]<<" "<<sum-dp[sum/2]<<endl; } return 0; }