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
*/
相关推荐
鼎艺创新科技8 分钟前
不依赖 UE/Unity:我们如何从零搭建一套国产三维 GIS 渲染引擎
人工智能·算法·unity·游戏引擎·三维电子沙盘
剩下了什么8 分钟前
float32 与 float64 精度陷阱:如何在 Go 中避免错误使用
开发语言·后端·golang
指尖时光.21 分钟前
Three.js 超全入门综合案例
开发语言·javascript·ecmascript
暴力求解1 小时前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip
吴声子夜歌1 小时前
Java面试题——基础(一)
java·开发语言
别动我齐刘海1 小时前
机器人运动控制学习2——基础进阶
c++·人工智能·神经网络·学习·目标检测·机器学习·机器人
小庞在加油1 小时前
WinDbg实战:QT/跨平台项目死锁与无响应问题排查指南
开发语言·qt·windbg·工具
Vae_Mars2 小时前
C#中的delegate委托
开发语言·c#
傻啦嘿哟2 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫
一直走下去-明2 小时前
简单的http抓包解包完整代码
开发语言·python