码迷,mamicode.com
首页 > 其他好文 > 详细

hdu5410CRB and His Birthday 多重背包

时间:2015-08-29 20:16:19      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

//n个物品 , 容量为m
//每个物品1个占用空间为w
//如果第i个物品选了k(k>0)个,所得权值为k*a+b 
//求最大权值
//多重背包 , 需要用二进制数优化
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 2010 ;
int dp[maxn][maxn] ;
int main()
{
   // freopen("in.txt" , "r" , stdin) ;
    int t ;
    scanf("%d" , &t) ;
    while(t--)
    {
        memset(dp[0] , 0 , sizeof(dp)) ;
        int n , m ;
        scanf("%d%d" , &m , &n) ;
        for(int i = 1;i <= n;i++)
        {
            int w  ,a , b ;
            scanf("%d%d%d" , &w , &a , &b) ;
            int c = m/w ;
            memcpy(dp[i] , dp[i-1] ,sizeof(dp[i-1])) ;
            for(int k = 1;k <= c ;k *= 2)
            {
                for(int j = m;j >= k*w;j--)
                dp[i][j] = max(dp[i][j] , max(dp[i][j - k*w] + a*k  , dp[i-1][j - k*w] + a*k + b)) ;
                c -= k ;
            }
            if(c)
            for(int j = m ;j >= c*w ;j--)
            dp[i][j] = max(dp[i][j] , max(dp[i][j-c*w] + a*c  , dp[i-1][j - c*w] + a*c + b)) ;
        }
        cout<<dp[n][m]<<endl;
    }
    return 0 ;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu5410CRB and His Birthday 多重背包

标签:

原文地址:http://blog.csdn.net/cq_pf/article/details/48090243

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!