HDU 2191(DP初步_F题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191

-----------------------------------------------------------------------------------

题意:给定经费金额n,有m种大米:给定金额val[i],质量wei[i],袋数num[i]。要求,在不超过给定金额的情况下,给出所能购买的最大质量。

思路:多重背包问题,将多重背包类比于0-1背包问题,无非是0-1背包仅有两种状态,选择或不选择。而在多重背包问题的情况下,转化为选择0-num[i]个的状态。

状态转移方程为:f[k]=max(f[k],f[k-val[i]]+wei[i]);(与0-1背包相同,不同的是循环层数不同,0-1背包只需判断一次,而多重背包需要循环num[i]次。)

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
int T =0;
const int MAXN =100+10;
int f[MAXN];
int val[MAXN];
int num[MAXN];
int wei[MAXN];

int main(void){
    scanf("%d",&T);
    for(int t=0;t<T;t++){
        memset(f,0,sizeof(f));
        int n =0;
        int m =0;
        scanf("%d %d",&m,&n);
        for(int i=0;i<n;i++){
            scanf("%d %d %d",&val[i],&wei[i],&num[i]);
        }
        
        for(int i=0;i<n;i++){
            for(int j=0;j<num[i];j++){
                for(int k=m;k>=val[i];k--){ 
                    f[k]=max(f[k],f[k-val[i]]+wei[i]);
                }
            }
        }
        printf("%d\n",f[m]); 
    }

    return 0;

}
View Code

 

posted @ 2018-01-30 16:56  caomp  阅读(121)  评论(0)    收藏  举报