珍惜现在,感恩生活

题目描述

在这里插入图片描述

知识点

多重背包问题

实现

码前思考

  1. 多重背包问题,直接套模板

代码实现

//属于多重背包问题 
#include "bits/stdc++.h"
using namespace std;

const int maxn = 110;
//注意应该是500,考虑到多重背包的原因 
const int maxm = 500;

//测试用例的数量
int C;
//钱的总数
int n;
//大米种类
int m; 
//大米价钱数组
int p[maxm];
//大米重量数组
int h[maxm];
//大米袋数
int c[maxm];

//dp数组
int dp[maxn]; 
 
int main(){
	scanf("%d",&C);
	while(C--){
		scanf("%d %d",&n,&m);
		
		//len表示多重背包的物品数 
		int len = 0; 
		for(int i=1;i<=m;i++){
			int x,y,z;
			scanf("%d %d %d",&x,&y,&z);
			//其实就是二进制编码 
			int j; 
			for(j=1;z-j>0;j=j*2){
				len++;
				p[len] = j * x;
				h[len] = j * y;
				z = z-j;
			}
			len++;
			p[len]=z*x;
			h[len]=z*y;
		}
		
		//对dp进行初始化
		for(int j=0;j<=n;j++){
			dp[j] = 0;
		}
		
		for(int i=1;i<=len;i++){
			//01背包的解法 
			for(int j=n;j >= p[i];j--){
				dp[j] = max(dp[j],dp[j-p[i]]+h[i]);
			}
		}
		
		printf("%d\n",dp[n]); 
	}
	return 0;
} 

码后反思

  1. 没有理解多重背包问题,只会套模板,(lll¬ω¬)
发布了138 篇原创文章 · 获赞 3 · 访问量 3815

猜你喜欢

转载自blog.csdn.net/yc_cy1999/article/details/105131484