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
*/
相关推荐
汉克老师25 分钟前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood38 分钟前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz1 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
朽棘不雕1 小时前
进一步了解模板
c++
Bruce_Liuxiaowei2 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
叠层归一研究院2 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia3 小时前
Diffusion Model 的基本原理与模型架构
算法
aramae3 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
汉克老师4 小时前
CSP-J 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-j·小学生·学c++编程
wabs6665 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树