5.29身败名裂

这篇博客探讨了编程竞赛中动态规划的巧妙运用,通过三个实例——完全背包、多重背包和二维背包问题,详细解释了如何将动态规划与物品体积、价值和限制条件相结合,解决复杂的问题。代码示例展示了如何高效地计算最小成本和最大收益,强调了初始化、方案累加以及避免背包溢出等关键点。
部署运行你感兴趣的模型镜像

busses

本题第一眼可能会让人迷惑,拨开题面看本质,这里里程其实可以看作十种物品同时里程也是所占体积,耗油数就是价值,随意换乘意味着物品可以取随意多件,那么这就是一个完全背包,总体积为想要行驶的里程数
代码:

#include<bits/stdc++.h>
#define N 1000005
#define ll long long
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
	return x*f;
}
int a[20],dp[500],d[11]={0,1,2,3,4,5,6,7,8,9,10};
int main(){
	for(int i=1;i<=499;i++)dp[i]=1e9;
	for(int i=1;i<=10;i++)a[i]=read();
	int n=read();
	for(int i=1;i<=10;i++)
		for(int j=d[i];j<=n;j++)
			dp[j]=min(dp[j],dp[j-d[i]]+a[i]);
	printf("%d",dp[n]);
	return 0;
}

注意:这里求最小值,要注意dp数组的初始化

prime

本题迷惑性极强,很容易让人去打素数表用数学方法求解,但如果我们将素数作为多个物品,素数的大小作为体积,本题就又变成了一个完全背包
代码:

#include<bits/stdc++.h>
#define N 1000005
#define ll long long
using namespace std;
inline int read() {
	int x=0,f=1;
	char c=getchar();
	while(!isdigit(c)) {
		if(c=='-')f=-1;
		c=getchar();
	}
	while(isdigit(c)) {
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
int prime[1005],pcnt,cnt[1005];
ll  dp[1005];
int used[1005];
int isprime[1005];
int main() {
	for(int i=2; i<=200; i++) {
		int flag=0;
		for(int j=2; j<i; j++)
			if(!(i%j)) {
				flag=1;
				break;
			}
		if(!flag) {
			prime[++pcnt]=i;
			isprime[i]=1;
		}
	}
	dp[0]=1;
	for(int i=1; i<=pcnt; i++)
		for(int j=prime[i]; j<=200; j++)
			dp[j]+=dp[j-prime[i]];
	int n;
	while(scanf("%d",&n)!=EOF)printf("%lld\n",dp[n]);
	return 0;
}

注意:
1、方案数需要求和而不是取最大值
2、多测可以离线计算,一定要注意到多测!

hallows

多重背包板子,要注意背包溢出问题
代码:

#include<bits/stdc++.h>
#define N 10005
#define ll long long
using namespace std;
inline ll read(){
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
	return x*f;
}
ll m[N],w[N],s[N],dp[N];
int main(){
	ll n=read(),v=read();
	for(int i=1;i<=n;i++){m[i]=read();w[i]=read();s[i]=read();}
	for(int i=1;i<=n;i++)
		for(int j=v;j>=w[i];j--)
			for(int k=1;k<=m[i]&&j>=k*w[i];k++)
				dp[j]=max(dp[j],dp[j-k*w[i]]+k*s[i]);
	printf("%lld",dp[v]);
	return 0;
}

pgrune

多重+二维背包,可以使用哈希合并维度(不建议使用)
代码:

#include<bits/stdc++.h>
#define N 10005
#define ll long long
using namespace std;
inline ll read(){
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
	return x*f;
}
ll p[N],r[N],dp[N][N],v[N],m[N];
int main(){
	ll n=read(),P=read(),R=read();
	for(int i=1;i<=n;i++){p[i]=read(),r[i]=read(),m[i]=read(),v[i]=read();if(!m[i])m[i]=1e9;}
	for(int i=1;i<=n;i++)
		for(int x=P;x>=p[i];x--)
			for(int y=R;y>=r[i];y--)
				for(int k=1;k<=m[i]&&x>=k*p[i]&&y>=k*r[i];k++)
					dp[x][y]=max(dp[x][y],dp[x-k*p[i]][y-k*r[i]]+k*v[i]);
	printf("%lld",dp[P][R]);
	return 0;
}

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### Keil MDK-ARM 5.29 版本介绍 Keil MDK-ARM 是一款专为 ARM 微控制器设计的集成开发环境 (IDE),被广泛用于嵌入式系统的开发。该工具链提供了编译器、调试器以及一系列库文件和支持工具,帮助开发者高效地编写和测试代码。 对于特定版本而言,Keil MDK-ARM 5.29 提供了一系列改进和优化功能,增强了对多种 ARM 架构的支持,包括但不限于 Cortex-M、Cortex-R4、ARM7 和 ARM9 处理器系列[^1]。 ### 下载途径 为了方便用户获取此版本,多个渠道提供了 Keil MDK-ARM 5.29 的下载服务: - **官方及第三方平台**:【安富莱】网站上列出了不同版本的 MDK 及其对应的 pack 文件可供选择,其中就包含有推荐使用的 MDK 5.30 版本以及其他历史版本如 5.29 等。 - **百度网盘分享链接**:除了官方网站外,还有其他在线存储空间也共享了这些资源,比如通过提供的百度网盘链接可以直接访问并下载 Keil MDK-ARM 5.29 Pack 文件[^2]。 ### 更新日志 最新一次关于 Keil MDK-ARM 5.29 的更新发生在 2024 年 8 月 27 日,此次更新主要增加了对该版本 Pack 包的提供,确保用户能够获得完整的安装包来进行本地化部署和使用。 ```python # Python 示例代码展示如何解析日期字符串 from datetime import datetime update_date_str = "2024-27" date_format = "%Y-%m-%d" def parse_update_date(date_string, format): try: parsed_date = datetime.strptime(date_string, format) return parsed_date.strftime("%B %d, %Y") except ValueError as e: return f"Error parsing date: {e}" print(parse_update_date(update_date_str, date_format)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值