欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 【装饰珠——分组背包】

【装饰珠——分组背包】

2025/5/11 2:35:17 来源:https://blog.csdn.net/m0_73669127/article/details/143855923  浏览:    关键词:【装饰珠——分组背包】

题目

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
int cnt[5];     // 存兼容i等级及以下的孔的数目的桶
int l[N], p[N]; // l[i] i号珠子等级 p[i] i号珠子的上限
int w[N][8], f[N]; // w[i][j] i号珠子镶嵌j个的值 f[i] 孔数为i的最大值
int m;          // 珠子种类int main()
{for(int i = 1; i <= 6; i++){int n;cin >> n;for(int j = 1; j <= n; j++){int t;cin >> t;cnt[t]++; // 统计每个等级的孔数量}}for(int i = 3; i; i--)cnt[i] += cnt[i+1]; // 累加,使得 cnt[i] 包含等级为 i 及以上的所有孔数量cin >> m;for(int i = 1; i <= m; i++){cin >> l[i] >> p[i]; // 输入第 i 种珠子的等级和上限for(int j = 1; j <= p[i]; j++)cin >> w[i][j]; // 输入第 i 种珠子镶嵌 j 个时的价值}int ans = 0;for(int i = 4; i; i--) // 从高往低开放孔的使用{for(int j = 1; j <= m; j++) // 枚举各组{if(l[j] == i) // 组等级要等于 i(不重复选取){for(int v = cnt[i]; ~v; v--) // 枚举孔数目{for(int t = 0; t <= p[j]; t++) // 枚举选择当前组物品数量的决策{if(v - t >= 0) f[v] = max(f[v], f[v - t] + w[j][t]); // 更新 f[v] 为当前孔数的最大价值ans = max(ans, f[v]); // 更新全局最优解}}}}}cout << ans; // 输出结果
}

注意(From TOTP)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词