http://acm.hdu.edu.cn/showproblem.php?pid=2191

 

    转化为01背包问题,只是将原来的放或不放第i件物品改为放几件第i件物品。

 

#include<cstdio>
#include<cstring>
#define max(a, b)   a>b?a:b
using namespace std ;
int dp[105] ;
struct page{
    int weight ;
    int value ;
    int num ;
}pg[105] ;
int main(){
    int t, n, m, i, j, k ;
    scanf("%d", &t) ;
    while(t--){
        scanf("%d%d", &n, &m) ;
        for(i=1; i<=m; i++)
            scanf("%d%d%d", &pg[i].weight, &pg[i].value, &pg[i].num) ;
        memset(dp, 0sizeof(dp)) ;
        for(i=1; i<=m; i++)
            for(k=1; k<=pg[i].num; k++)
                for(j=n; j>=pg[i].weight; j--)
                    dp[j] = max(dp[j], dp[j-pg[i].weight]+pg[i].value) ;
        printf("%d\n", dp[n]) ;
    }
    return 0 ;

} 

posted on 2011-11-14 23:14  追逐.  阅读(246)  评论(0编辑  收藏  举报