多重背包

多重背包

https://ac.nowcoder.com/acm/contest/59977/1106

思路:模板题,利用二进制优化

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;

int w[N],v[N],dp[N];
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int n,m;
	cin >> n >> m;
	
	int cnt = 0;
	for(int i = 1; i <= n; i ++){
		int a,b,c;
		cin >> a >> b >> c;
		int k = 1; 
		while(k <= a){
			cnt ++;
			v[cnt] = b * k;
			w[cnt] = c * k;
			a -= k;
			k *= 2;
		}
		if(a){
			cnt ++;
			v[cnt] = b * a;
			w[cnt] = c * a;
		}
	}
	n = cnt;
	for(int i = 1; i <= n; i ++){
		for(int j = m; j >= v[i]; j --){
			dp[j] = max(dp[j],dp[j - v[i]] + w[i]);
		}
	}
	cout << dp[m];
	return 0;
}

全部评论

相关推荐

03-29 14:19
门头沟学院 Java
你背过凌晨4点的八股文么:加油同学,人生的容错率很高,只是一个暑期罢了,后面还有很多机会!
点赞 评论 收藏
分享
你背过凌晨4点的八股文么:简历挂了的话会是流程终止,像我一样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务