Acwing 3306.装珠饰(十一届蓝桥java/py组J题)

分析:

6件装备作为一个整体去看待!!!加的效果是看总的装备数目

分组背包的一个特点:每一个组里面只能取出一个物品,这里是把抽象成不同的方案数(有点多重背包的二进制处理方法的感觉。)

代码实现:

cpp 复制代码
#include <iostream>
using namespace std;
const int N = 1e4 + 10;

int cnt[5];             // 表示cnt_i对应的总的孔的数目
int capacity[5];        // 表示四个阶段的容量
int zhu_rank[N];        // 珠宝上的等级应该<=嵌入装饰孔的等级
int upper_bound[N];     // 每个珠宝装饰的一个上限
int w[N][10];
int f[N];               // f_ij表示只用前i个珠子,用<=孔容量j的情况下=====>得到的总价值
int n;  // n种装饰珠


int main()
{
    // 装饰孔数量和等级的读取
    for(int i = 0; i < 6; i ++)
    {
        int y; cin >> y;int rk;
        /*实际上,将6个武器作为一个整体,是不关心每个武器上的具体有多少相应等级的孔的,
        只关心6个武器中孔不同等级的总数.*/
        for(int j = 0; j < y; j ++)
            cin >> rk, cnt[rk] ++;
    }
    
    /*先是使用rank=4的孔,这时候孔的数量就是背包的容量;然后使用rank=3的孔,
    这时候背包的容量应该是rank=4的孔数量+rank=3的孔数量....*/
    for(int i = 1; i <= 4; i ++)            // 将每个阶段的背包容量预处理出来
        capacity[i] = capacity[i - 1] + cnt[4 - i + 1];

    cin >> n; // n种装饰珠,一个小细节:下标统一从1开始.
    for(int i = 1; i <= n; i ++)
    {
        cin >> zhu_rank[i] >> upper_bound[i];
        for(int j = 1; j <= upper_bound[i]; j ++)
            cin >> w[i][j];
    }
    
    // 分组背包dp
    for(int rk = 4; rk; rk --) // 孔的等级从高到低逐个释放,这样子就不用担出现L级的珠宝对于L-1级的孔不适用的非法背包状态了
    {
        for(int i = 1; i <= n; i ++)    // 一次考虑每一个珠宝
            if(zhu_rank[i] == rk)       // 不重不漏(主要是防止重复)
                for(int j = capacity[4 - rk + 1]; j >= 0; j --)
                    for(int k = 0; k <= upper_bound[i]; k ++)
                        if(j >= k)
                            f[j] = max(f[j], f[j - k] + w[i][k]);   //选k方案
    }
    int res = -1; 
    for(int i = 0; i <= capacity[4]; i ++)
        res = max(res, f[i]);
    cout << res << endl;
    return 0;
}
相关推荐
LYFlied4 小时前
【每日算法】LeetCode 64. 最小路径和(多维动态规划)
数据结构·算法·leetcode·动态规划
Salt_07284 小时前
DAY44 简单 CNN
python·深度学习·神经网络·算法·机器学习·计算机视觉·cnn
货拉拉技术4 小时前
AI拍货选车,开启拉货新体验
算法
MobotStone5 小时前
一夜蒸发1000亿美元后,Google用什么夺回AI王座
算法
Wang201220135 小时前
RNN和LSTM对比
人工智能·算法·架构
xueyongfu5 小时前
从Diffusion到VLA pi0(π0)
人工智能·算法·stable diffusion
永远睡不够的入5 小时前
快排(非递归)和归并的实现
数据结构·算法·深度优先
cheems95275 小时前
二叉树深搜算法练习(一)
数据结构·算法
sin_hielo5 小时前
leetcode 3074
数据结构·算法·leetcode
Yzzz-F5 小时前
算法竞赛进阶指南 动态规划 背包
算法·动态规划