读书人

POJ 1276 多重双肩包

发布时间: 2012-09-25 09:55:59 作者: rapoo

POJ 1276 多重背包

模版题,贴个代码

#include <iostream>#include <cstdio>#include <algorithm>#include <string>#include <cmath>#include <cstring>#include <queue>#include <set>#include <vector>#include <stack>#include <map>#include <iomanip>#define PI acos(-1.0)#define Max 100005#define inf 1<<28#define LL(x) (x<<1)#define RR(x)(x<<1|1)using namespace std;int c[Max],num[Max];int m;int dp[Max];void zero(int v)//0-1背包{    for(int i=m;i>=v;i--)    dp[i]=max(dp[i],dp[i-v]+v);//此题v=w}void com(int v)//完全背包{    for(int i=v;i<=m;i++)    dp[i]=max(dp[i],dp[i-v]+v);}void mu(int v,int w,int n)//多重背包{    if(v*n>=m)    {        com(v);        return ;    }    int k=1;    while(k<n)    {        zero(k*v);        n-=k;        k*=2;    }    zero(n*v);}int main(){    int i,j,k,l,n;    while(scanf("%d",&m)!=EOF)    {        scanf("%d",&n);        for(i=1;i<=n;i++)        scanf("%d%d",&num[i],&c[i]);        memset(dp,0,sizeof(dp));        for(i=1;i<=n;i++)        mu(c[i],c[i],num[i]);        cout<<dp[m]<<endl;    }    return 0;}



读书人网 >编程

热点推荐