HDU 2191 珍惜现在,感恩生活(多重背包)

来源:互联网 发布:成都理工大学网络教育 编辑:程序博客网 时间:2024/06/04 20:11

OJ题目 : click here ~~

题目分析:就一个多重背包,在输入的时候进行二进制拆分,接下来就与01背包一样处理了。关于二进制拆分,这里讲解的不错~

AC_CODE

int v[1002] , c[1002];int dp[1002];int main(){    int t;    cin >> t;    while(t--)    {        int n ,m , i , j , a , b , d ,k = 0;        cin >> n >> m;        for(i =1;i <= m;i++)        {            scanf("%d%d%d",&a ,&b ,&d);            for(j = 1;j <= d;j <<= 1)//进行二进制拆分            {                c[k] = j*a;                v[k++] = j*b;                d -= j;            }            if(d > 0)            {                c[k] =  d*a;                v[k++] = d*b;            }        }        memset(dp , 0 , sizeof(dp));        for(i = 0;i < k;i++)            for(j = n;j >= c[i];j--)            dp[j] =  max(dp[j] , dp[j - c[i]] + v[i]);        cout << dp[n] << endl;    }    return 0;}


0 0
原创粉丝点击