背包问题(01背包)

A-采药

题意:题目的意思很明确,药童上山采药,要你求在规定的时间内使采药的价值最大
题解:标准的0-1背包格式,每一件物品只有两种状态:选 or 不选;每一件物品只能用一次。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int T,M;
int v[150]={0},p[150]={0};
ll f[1010]={0}; 
int main(){
	cin>>T>>M;
	for(int i=1;i<=M;i++){
		cin>>v[i]>>p[i];
	}
	for(int i=1;i<=M;i++){
		for(int j=T;j>=v[i];j--){
			f[j]=max(f[j],f[j-v[i]]+p[i]);
		}
	}
	cout<<f[T]<<endl;
	return 0;
} 

B-开心的金明

题意:简单的0-1背包问题,但这里要我们求得是体积与价值的乘积和最大的值
题解:简单0-1背包
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int N,m;
int v[30]={0};
int p[30]={0};
ll num[30][30010]={0};
ll ans[30010]={0};
int main(){
	cin>>N>>m/*m件物品*/;
	//方法 一
	for(int i=1;i<=m;i++){
		cin>>v[i]>>p[i];
	}//数据输入完毕,下面开始遍历背包
	for(int i=1;i<=m;i++){
		for(int j=N;j>=v[i];j--){
			ans[j]=max(ans[j],ans[j-v[i]]+v[i]*p[i]);
		}
	}
	//方法 二
//	for(int i=1;i<=m;i++){
//		for(int j=0;j/*这个相当于容量*/<=N;j++){
//			num[i][j]=num[i-1][j];
//			if(j>=v[i]){
//				num[i][j]=max(num[i][j],num[i-1][j-v[i]]+v[i]*p[i]);
//			}
//		}
//	} 
//	ll res=0;
//	for(int i=0;i<=N;i++) res=max(res,num[m][i]);
//	cout<<res<<endl;
	cout<<ans[N]<<endl;
	return 0;
} 









全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务