P1049装箱问题

写博客主要是记录  做的这些动态规划都是基础题,主要是为了熟悉如何思考动态规划类型的题目,遇到简单题能有头绪,遇到难题能找到思考点

本题和01背包类似,也是物品装或者不装,但本题要求的是最小容量,这就又说明了细节点会与01背包有所不同

以下是代码

#include<bits/stdc++.h>
#define endl '\n'
#define int int64_t
using namespace std;
int n, v, w[35], f[20005];
signed main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> v >> n;
	for (int i = 1; i <= n; ++i) cin >> w[i];
	for (int i = 1; i <= n; ++i) {
		for (int j = v; j >= 1; --j) {
			 //加了以后,剩余容量能减少就放
			if (j >= w[i] && f[j - w[i]] + w[i] <= j) {
					//可以放
					f[j] = max(f[j]/*不放*/, f[j - w[i]] + w[i]/*放*/);
			}
		}
	}
		/*for (int j = 1; j <= v; ++j) {
			cout << f[j] << "  ";
	}*/
	cout << v - f[v] << endl;
	return 0;
}

值得一提的是,这题和一道送礼物的题很像,但那题是没法用动态规划做的,这个动态规划本质上是穷举,用空间换时间,如果这道题的最大容量是10^9,这就导致压根开不出这么大的数组,也压根没法遍历这么大的数组,就要用到搜索,而且是双向搜索(但我不会写T_T)  <---  那你写这段话干啥?  <-- 装一波不行吗?^_^ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值