CCF-CSP 37-2 机器人饲养指南(apple)【C++】考点:完全背包问题

题目

TUOJhttps://sim.csp.thusaac.com/contest/37/problem/1

思路

DP,完全背包问题

代码

可以让AI总结一下代码逻辑

这是一个完全背包问题的解法,用于计算在给定重量限制下能获得的最大价值。

一、问题背景

  • n 种石头,每种石头有固定的重量和价值

  • 总重量限制为 m

  • 每种石头可以无限次选取(完全背包特征)

二、数据设定

  • v[i]:第 i 种石头的价值

  • w[i]:第 i 种石头的重量(这里设 w[i] = i,即第 i 种石头的重量就是 i)

  • f[j]:重量限制为 j 时能获得的最大价值

三、核心逻辑

1. 输入处理
  • 先读入总重量限制 m 和石头种类数 n

  • 然后读入每种石头的价值 v[i]

  • 每种石头的重量 w[i] 直接设为 i(第 i 种石头重量为 i)

2. 动态规划求解
cpp 复制代码
for(int i=1;i<=n;i++)              // 遍历每种石头
    for(int j=w[i];j<=m;j++)        // 遍历重量(从小到大)
        f[j] = max(f[j], f[j-w[i]] + v[i]);
  • 外层循环:依次考虑每种石头

  • 内层循环:从小到大遍历重量

  • 状态转移:对于当前重量 j,可以选择:

    • 不选当前石头:保持 f[j]

    • 选一个当前石头:价值增加 v[i],重量减少 w[i]

3. 输出结果

输出 f[m],即总重量限制为 m 时的最大价值

四、关键特点

  • 完全背包特征:内层循环从小到大(区别于 01 背包的从大到小)

  • 重量等于编号:第 i 种石头的重量就是 i

  • 一维优化:使用滚动数组,空间复杂度 O(m)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
const int N=10005;

int f[N],v[N],w[N]; 

void solve()
{
	int n,m; cin>>m>>n; //m 总个数  n 石头种数 
	for(int i=1;i<=n;i++) 
	{
		cin>>v[i];
		w[i]=i;
	}
	for(int i=1;i<=n;i++)
		for(int j=w[i];j<=m;j++)
			f[j]=max(f[j],f[j-w[i]]+v[i]); 
			
	cout<<f[m]<<endl;
}

int main()
{
	cin.tie(0);
	solve();
	return 0;
} 

/*
10 5
1 3 5 3 1

4 3
1 60 100
*/
相关推荐
数智工坊1 分钟前
【深度学习RL】A3C:异步强化学习的革命——用CPU打败GPU的深度RL算法
论文阅读·人工智能·深度学习·算法·transformer
灵智实验室2 分钟前
PX4状态估计技术EKF2详解(三):EKF2 外部视觉融合——延迟后验状态与触发机制
算法·无人机·px 4
爱吃提升6 分钟前
Yifan Hu(适合大规模数据)大数据算法
开发语言·算法·php
Xpower 176 分钟前
从PHM到AI Agent-如何用OpenClaw构建设备健康诊断智能体
网络·人工智能·学习·算法
一只旭宝6 分钟前
【C++入门精讲13】异常处理
c++
c++之路10 分钟前
装饰器模式(Decorator Pattern)
java·开发语言·装饰器模式
Yolo566Q12 分钟前
环境土壤物理模型HYDRUS1D/2D/3D实践技术应用系统性学习
大数据·开发语言·gpt·学习·arcgis·r语言
洛水水12 分钟前
【力扣100题】24. 旋转图像
算法·leetcode
计算机安禾16 分钟前
【c++面向对象编程】第5篇:类与对象(四):赋值运算符重载
java·前端·c++