蓝桥杯备战——Day 3采药2

这篇博客探讨了两种动态规划应用:一种是处理多个相同物品的背包问题,另一种是考虑失败经验的药品分配问题。在背包问题中,通过一维或二维数组实现,确定最大价值。在药品分配问题中,每个药品有失败和成功经验,并需要根据药品需求量进行决策。两题都强调了数据类型的选取和循环条件的重要性。
摘要由CSDN通过智能技术生成

题目

题目链接

思路

Day2同种类型的题目,只不过这个是一种物品可以放多个 
则使用一维数组最为简单,或者说你可以依旧使用二维数组,但是中间要加一个for循环,判断拿几个的时候价值最大 

代码

#include<iostream>
#include<algorithm>
using namespace std; 
long long t,m;
long long dp[10000002]={0};
long long a[10002][2];

int main(){
	cin>>t>>m;
	for(long long i=1;i<=m;i++){
		cin>>a[i][0]>>a[i][1];//a[i][0]是容量,a[i][1]是价值 
	}
	
	for(long long j=1;j<=m;j++){
		for(long long i=1;i<=t;i++){
		//dp[i]是容量时候能有的最大值 
		//依然分为这个东西能不能拿,如果能拿,那要不要拿
		if(i>=a[j][0]){
			 dp[i]=max(a[j][1]+dp[i-a[j][0]],dp[i]);
		} 
		else{
				dp[i]=dp[i];
			}
		}
	}
	cout<<dp[t];
	return 0;
}

巩固题

巩固题链接

巩固题注意事项

**1.数据大小不要想当然,多用long long 总没错**
**2.注意本题有一点是,失败了也有经验拿(相当于那个物品虽然不放,也有价值存于背包),因此背包容量递增要从0开始,因为0也有价值**
**3.刚开始代码出错了,是因为我把循环中j写成了总量x**

标题

代码

/*
本题目是背包dp,并且是每个物品只有一个 
*/
#include<iostream>
#include<algorithm>
using namespace std;
long long n,x;
long long a[1002][3];
long long dp[1002][1002]={0};
int main(){
	cin>>n>>x;//n为好友个数,x为所拥有的药的个数
	for(int i=1;i<=n;i++){
		cin>>a[i][0]>>a[i][1]>>a[i][2];//a[i][0]为失败经验,a[i][1]为成功经验,a[i][2]是所需药品数量 
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<=x;j++){
			if(j>=a[i][2]){//首先判断是否能打赢 
			dp[i][j]=max(a[i][1]+dp[i-1][j-a[i][2]],dp[i-1][j]+a[i][0]);
			}
			else{
				dp[i][j]=dp[i-1][j]+a[i][0];
			}
		} 
	}
	cout<<dp[n][x]*5;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值