HDU 2844(多重背包)

来源:互联网 发布:萍乡教育网网络管理 编辑:程序博客网 时间:2024/06/04 18:34

裸的多重背包模板,需要二进制优化才能不超时 0.0


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <map>using namespace std;//#define memset(a,b,sizeof a) cir(a,b)const int maxn = 100000+10;int v[maxn],w[maxn];int n,m;int dp[maxn];void ZeroOnePack(int v,int w){    for(int i=m;i>=w;i--)    {        dp[i] = max(dp[i],dp[i-v]+v);    }}void AllPack(int v,int w){    for(int i=w;i<=m;i++)    {        dp[i] = max(dp[i],dp[i-v]+v);    }}void MultPack(int v,int w,int number){    if(number * w >= m)    {        AllPack(v,w);    }    else    {        int k=1;        while(k<=number)        {            ZeroOnePack(k*v,k*w);            number -= k;            k *= 2;        }        ZeroOnePack(number*v,number*v);    }}map<int,int> Map;int main(){    while(scanf("%d%d",&n,&m)!=EOF && (n&&m))    {        //cir(v,0),cir(w,0);//        Map.clear();        memset(v,0,sizeof(v));        memset(w,0,sizeof(w));        memset(dp,0,sizeof(dp));        for(int i=0;i<n;i++)        {            scanf("%d",&v[i]);        }        for(int i=0;i<n;i++)        {            scanf("%d",&w[i]);        }        for(int i=0;i<n;i++)        {            MultPack(v[i],v[i],w[i]);        }        int sum = 0;        for(int i=1;i<=m;i++)        {            if(dp[i]>=i) sum++;        }        cout << sum <<endl;    }    return 0;}


原创粉丝点击