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; }