HDU 2844 coins

来源:互联网 发布:protty网络验证 编辑:程序博客网 时间:2024/06/05 03:27
做的第一个多重背包,看了背包九讲之后才把模板看懂,真心觉得背包九讲不错
#include <iostream>#include<stdio.h>#include<string>#include<cstring>#include<algorithm>#include<cmath>#define N 100010using namespace std;int vol[N],val[N];int n,m;int dp[N];void zeroonebag(int c,int w){    for(int i=m;i>=c;i--)    dp[i]=max(dp[i],dp[i-c]+w);}void combag(int c,int w){    for(int i=c;i<=m;i++)    dp[i]=max(dp[i],dp[i-c]+w);}void mulbag(int c,int w,int p){    if(c*p>m)combag(c,w);    else    {        int k=1;        while(k<p)//二进制转化思想        {            zeroonebag(c*k,w*k);            p-=k;            k<<=1;        }        zeroonebag(p*c,p*w);    }}int main(){    while(~scanf("%d%d",&n,&m))    {        if(n+m==0)break;        memset(dp,0,sizeof(dp));        for(int i=1;i<=n;i++)        scanf("%d",&val[i]);        for(int i=1;i<=n;i++)        scanf("%d",&vol[i]);        for(int i=1;i<=n;i++)        {            mulbag(val[i],val[i],vol[i]);        }        int ans=0;        for(int i=1;i<=m;i++)        {            if(dp[i]==i)            ans++;        }        printf("%d\n",ans);    }    return 0;}

0 0
原创粉丝点击