中中的背包(01背包,完全背包,二进制优化时间复杂度)

题目描述
每个人小时候都有自己的理想,但随着时间推移,渐渐的大多数人的理想变成了金钱.地位.面子… 于是大多数人 就变成了传说中的俗人。但我们的中中始终有自己的梦想,他要 环 游 世 界! 在20XX年X月X日中中开始环游世 界的准备工作.他开始准备自己的行囊中中背包的容积为m ,中中有n样有用的东西 ,每样东西都有自己的价值Wi,和体积Vi ,每一样物品有Pi个 (Pi=0时表示有无限多个),于是乎我们的问题就是(你应该已经猜到了)…中中能带走的 东西的最大价值。

输入格式
第 1 行: N,M–物品的种类和背包的容积 第 2-N+1 行: Vi,Wi,Pi–三个整数:每个物品的体积.价值.个数

输出格式
单独的一行在给定的限制里可能得到的最大的价值。

样例输入
5 50
1 1 50
2 4 3
48 49 1
1 51 1
3 3 3

样例输出
106

提示
30%数据满足 1 <= m,n <=1000
100%数据满足 1 <=m,n <= 10000

#include<iostream>
using namespace std;
const int MAX=10005;
int dp[MAX];
int main(){
    
    
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
    
    
		int v,w,c;
		cin>>v>>w>>c;
		if(c==0||m/v<=c){
    
    
			for(int j=v;j<=m;j++)
				dp[j]=max(dp[j],dp[j-v]+w);
		}
		else{
    
    
			int base=1;
			while(c){
    
    
				c-=base;
				int tv=base*v,tw=base*w;
				for(int j=m;j>=tv;j--)
					dp[j]=max(dp[j],dp[j-tv]+tw);
				base*=2;
				base=min(base,c);
			}
		}
	}
	cout<<dp[m];
}

猜你喜欢

转载自blog.csdn.net/m0_51794965/article/details/111190435