潜水员(背包dp不小于问题)

潜水员为了潜水要使用特殊的装备。

他有一个带2种气体的气缸:一个为氧气,一个为氮气。

让潜水员下潜的深度需要各种数量的氧和氮。

潜水员有一定数量的气缸。

每个气缸都有重量和气体容量。

潜水员为了完成他的工作需要特定数量的氧和氮。

他完成工作所需气缸的总重的最低限度的是多少?

例如:潜水员有5个气缸。每行三个数字为:氧,氮的(升)量和气缸的重量:

3 36 120

10 25 129

5 50 250

1 45 130

4 20 119
如果潜水员需要5升的氧和60升的氮则总重最小为249(1,2或者4,5号气缸)。

你的任务就是计算潜水员为了完成他的工作需要的气缸的重量的最低值。

输入格式

第一行有2个整数 m,n。它们表示氧,氮各自需要的量。

第二行为整数 k 表示气缸的个数。

此后的 k 行,每行包括ai,bi,ci,3个整数。这些各自是:第 i 个气缸里的氧和氮的容量及气缸重量。

输出格式

仅一行包含一个整数,为潜水员完成工作所需的气缸的重量总和的最低值。

数据范围

1≤m≤21,
1≤n≤79,
1≤k≤1000,
1≤ai≤21,
1≤bi≤79,
1≤ci≤800

输入样例:

5 60
5
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119

输出样例:

249

历程:中午学习dp的时候会了一点东西,想写博客总结一下,奈何下午的我实在是太困倦了,于是就去睡了一觉,现在感觉精神棒棒哒,感谢我成长路上帮助我的人。

明显是dp二维费用背包,其实这道问题并不是特别难,主要还是补一下我博客题目做法的种类。

状态转移方程:f[i][j][k]表示在前i个物品中选,然后氧气体积不小于j,氮气体积不小于k的气体罐重量的最小值。

状态转移方程:f[i][j][k] = min(f[i-1][j-v1][k-v2] + m , f[i-1][j][k])

这里需要注意一点,我们的j可能小于v1k可能小于v2,一般可能就将此状态当成不合法状态来处理。但是考虑到我们的状态定义为不小于,那么我们就不能将此状态当成不合法的状态来处理,即从实际意义出发:体积不小于负数的状态依然成立,只不过我们当中每个氧气的体积和氮气的体积都是大于0的,所以我们可以将此状态看成0来处理,因为大于0的状态肯定等于大于负数的状态嘛.

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110;

int f[N][N];

int main()
{
	memset(f, 0x3f, sizeof f);
	int n, m, k; cin >> n >> m >> k;

	f[0][0] = 0;
	for (int i = 1; i <= k; i++)
	{
		int v, m1, w; cin >> v >> m1 >> w;

		for (int j = n; j >= 0; j--)
		{
			for (int k = m; k >= 0; k--)
			{
			    
				if (j < v && k < m1) f[j][k] = min(f[j][k], w);

				else if(j < v)f[j][k] = min(f[j][k], f[0][k - m1] + w);
				
				else if(k < m1)f[j][k] = min(f[j][k], f[j - v][0] + w);

				else f[j][k] = min(f[j][k], f[j - v][k - m1] + w);
				
                //f[0][0] = 0;
			}
		}
		//cout << f[n][m] << ' ' << f[0][0] << endl;
	}
	cout << f[n][m] << endl;

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值