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; }

浙公网安备 33010602011771号