多重背包(二进制优化)

来源:互联网 发布:three.js skybox 编辑:程序博客网 时间:2024/06/03 22:40

类似于poj 1014
qduoj

#include<bits/stdc++.h>#define maxn 100007using namespace std;int mm[20][20];int dp[maxn];int v[maxn];int w[maxn];int main(){    int n,m,t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        memset(mm,0,sizeof(mm));        memset(dp,0,sizeof(dp));         int ti,vi;        for(int i=0;i<n;i++)        {            scanf("%d%d",&ti,&vi);            mm[ti][vi]++;        }        int cnt=1;        for(int i=1;i<=10;i++)            for(int j=1;j<=10;j++)            {                int tmp = mm[i][j];                for(int k=1;k<=tmp;k<<=1)                {                    v[cnt]=j*k;                    w[cnt]=i*k;                    cnt++;                    tmp-=k;                }                if(tmp>0)                {                    v[cnt]=j*tmp;                    w[cnt]=i*tmp;                    cnt++;                }            }        for(int i=1;i<cnt;i++)            for(int j=m;j>=w[i];j--)                dp[j]=max(dp[j-w[i]]+v[i],dp[j]);        cout<<dp[m]<<endl;    }    return 0;}