每日一题-P1855 榨取kkksc03

榨取kkksc03

P1855 榨取kkksc03 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

输入:

6 10 10
1 1
2 3 
3 2
2 5
5 2
4 3

输出:

4

这题是一道01背包的变形,二维费用背包题 (其实就是增加了一个背包容量的限制)

二维费用的背包问题是指对于每件物品,具有两种不同的费用,选择这件物品必须同时付出这两种费用。对于每种费用都有一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值。

在这道题中,根据题意可知道,两个背包容量是时间 t[i] 金钱m[i],

因为求的是愿望的个数,所以每份的价值都为1

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

这个方程也能像一般01背包一样进行维度压缩:

压缩后状态转移方程:  f[j][k] = max(f[j][k], f[j - m[i]][k - t[i]] + 1);

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 300, INF = 0x3f3f3f3f;
int n, M, T;
int t[N], m[N]; //时间,金钱
int f[N][N];

int main() {
	cin >> n >> M >> T;
	for (int i = 1; i <= n; i++) {
		cin >> m[i] >> t[i];
	}

	for (int i = 1; i <= n; i++) {
		for (int j = M; j >= m[i]; j--) { //金钱
			for (int k = T; k >= t[i]; k--) { //时间
				f[j][k] = max(f[j][k], f[j - m[i]][k - t[i]] + 1);
			}
		}
	}
	cout << f[M][T];
	return 0;
}

二维费用背包模板题 

 8. 二维费用的背包问题 - AcWing题库

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 300, INF = 0x3f3f3f3f;
int n, V, M;
int v[N], m[N], w[N];
int f[N][N];
int main() {
	cin >> n >> V >> M;
	for (int i = 1; i <= n; i++) {
		cin >> v[i] >> m[i] >> w[i];
	}

	for (int i = 1; i <= n; i++) {
		for (int j = V; j >= v[i]; j--) { //体积
			for (int k = M; k >= m[i]; k--) { //重量
				f[j][k] = max(f[j][k], f[j - v[i]][k - m[i]] + w[i]);
			}
		}
	}
	cout << f[V][M];
	return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月色美兮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值