背包DP——混合背包
顾名思义,混合背包就是将前面三种的背包问题(01,完全,多重)混合起来,有的只能取一次,有的能取无限次,有的只能取 k 次。
正解
特解
部分情况下,如小数据,可以转换成多重背包(把完全情况的数量换成足够大,如1e7,就把完全相对变成了多重)
例题
https://www.luogu.com.cn/problem/P1833
樱花
题目背景
《爱与愁的故事第四弹·plant》第一章。
题目描述
爱与愁大神后院里种了
输入格式
共
第 hh:mm
,其中
第
输出格式
只有一个整数,表示最大美学值。
样例 #1
样例输入 #1
6:50 7:00 3
2 1 0
3 3 1
4 5 4
样例输出 #1
11
提示
样例解释:赏第一棵樱花树一次,赏第三棵樱花树
Code
点击查看代码
const int maxn = 1e7 + 10;
int dp[maxn], w[maxn], v[maxn], sum[maxn];
int wnew[maxn], vnew[maxn];
pair<int, int> huan(string s) {
int h, t;
h = s[0] - '0';
if (s.size() == 5) {
h = h * 10 + s[1] - '0';
t = (s[3] - '0') * 10 + s[4] - '0';
}
else { t = (s[2] - '0') * 10 + s[3] - '0'; }
pair<int, int> p;
p = {h, t};
return p;
}
void solve() {
int n, m;
string s1, s2;
cin >> s1 >> s2 >> n;
auto [a1, b1] = huan(s1);
auto [a2, b2] = huan(s2);
m = (a2 - a1) * 60 + b2 - b1;
int cnt = 0;
for (int i = 1; i <= n; i++) {
cin >> w[i] >> v[i] >> sum[i];
int x = sum[i], j = 1;
if (x == 0) x = maxn;
while (x) {
if (j <= x) {
x -= j;
wnew[++cnt] = w[i] * j;
vnew[cnt] = v[i] * j;
j <<= 1;
}
else {
wnew[++cnt] = w[i] * x;
vnew[cnt] = v[i] * x;
break;
}
}
}
for (int i = 1; i <= cnt; i++) {
for (int j = m; j >= wnew[i]; j--) {
dp[j] = max(dp[j], dp[j - wnew[i]] + vnew[i]);
}
}
cout << dp[m];
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人