当前位置: 首页 > news >正文

洛谷P1049装箱问题 ————递归+剪枝+回溯

没没没没没没没没没错,又是一道简单的递归,只不过加了剪枝,我已经不想再多说,这道题写了一开始写了普通深搜,然后tle了一个点,后面改成剪枝,就ac了,虽然数据很水,但是不妨碍我们练习搜索。

先画个草图:

从1开始找,找下一层最左边的2,判断箱子里是否能装下这个物体,如果能,装进去。(现在箱子里装了(1,2) 体积是(8+3=11)

然后继续下一层继续判断,能否装下。(找最左边的3,现在箱子里装了(1,2,3) 体积是(8+3+12=23)

再找下一个,4,发现23+7>24,就是箱子装不下了,那就跳过4,往下搜。

当搜完了,我们就返回上一层重复这个步骤即可。

上代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cctype>
#include<map>
#include<set>
#include<queue>
#include<numeric>
#include<iomanip>
using namespace std;
const int N = 30+7;
const int V = 2e4 + 7;
int a[N];
int flag[N];
int n, v, ans=0x7fffffff;
void dfs(int x, int v) {
		ans = min(ans, v);
	for (int i = x; i < n; i++) {
		if (flag[i] == 0) {
			if (v - a[i] >= 0) {
				flag[i] = 1;
				dfs(i + 1, v - a[i]);
				flag[i] = 0;
			}
		}
	}
}
int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> v >> n;
	for (int i = 0; i < n; i++)cin >> a[i];
	dfs(0, v);
	cout << ans;
}

相关文章:

  • 安卓密码框、EditText
  • nginx反向代理到aws S3 ,解决S3返回500、502、503错误
  • Vue3中定义变量是选择ref还是reactive?
  • Redis SDS 源码
  • 开启三层交换机DHCP服务
  • Golang数据类型(字符串)
  • 剑指 Offer(第2版)面试题 18:删除链表的节点
  • [组合数学]LeetCode:2954:统计感冒序列的数目
  • 三、DVP摄像头调试笔记(图片成像质量微调整,非ISP)
  • JavaScript 基础
  • 深入理解指针3
  • 软著项目推荐 深度学习的水果识别 opencv python
  • Hadoop学习笔记(HDP)-Part.14 安装YARN+MR
  • Python自动化——driver.switch_to的用法
  • 免费数据采集软件,多种数据采集方式
  • 混音编曲软件tudio One 6.5.1 保姆级安装教程
  • CopyOnWriteArrayList怎么用
  • Javafx实现浏览器
  • 【UGUI】sprite精灵的创建与编辑
  • 【LeetCode刷题笔记】103. 二叉树的锯齿形层序遍历
  • 一手实测深夜发布的世界首个设计Agent - Lovart。
  • 成都警方通报:8岁男孩落水父母下水施救,父亲遇难
  • 泽连斯基批准美乌矿产协议
  • 西藏日喀则市拉孜县发生5.5级地震,震感明显部分人被晃醒
  • 交涉之政、交涉之学与交涉文献——《近代中外交涉史料丛书》第二辑“总序”
  • 习近平出席俄罗斯纪念苏联伟大卫国战争胜利80周年庆典