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
*/
相关推荐
下地种菜小叶7 小时前
定时任务系统怎么设计?一次讲清任务注册、分布式调度、幂等执行与失败补偿
java·开发语言·数据库·oracle·rabbitmq
csbysj20208 小时前
业务代表模式
开发语言
sghuter8 小时前
AI重塑工程师:未来核心能力全景图
开发语言·perl·composer·symfony
浪客川8 小时前
【百例RUST - 013】泛型
开发语言·后端·rust
Robot_Nav8 小时前
DPMPC-Planner:复杂静态环境与动态障碍物下的无人机实时轨迹规划框架
c++·无人机·mpc
iiiiyu8 小时前
常用API(SimpleDateFormat类 & Calendar类 & JDK8日期 时间 日期时间 & JDK8日期(时区) )
java·大数据·开发语言·数据结构·编程语言
故事和你918 小时前
洛谷-数据结构1-4-图的基本应用2
开发语言·数据结构·算法·深度优先·动态规划·图论
qq_12084093718 小时前
Three.js 工程向:Clock、deltaTime 与固定步长主循环
开发语言·javascript·ecmascript
小菜同学爱学习8 小时前
夯实基础!MySQL数据类型进阶、约束详解与报错排查
开发语言·数据库·sql·mysql
吴可可1239 小时前
C#合并首尾相连多段线实战
算法·c#