编程题五:装饰珠

解题思路

看懂题意之后发现挺简单的。

猎人有6个装备,每个装备上有若干个装饰孔,每个装饰孔有自己的等级L,装饰孔上只能装等级小于L的装饰珠

求的是在所有孔上安装珠(孔也可以不安装珠),能获得的最大价值。

暴力解法:

6个装备相当于6层递归,在每一层递归(每个装备)枚举每一个装饰孔每一个可装入等级,如示例

第1个装备上有1个L=1的孔,

        在该孔上可以选择不安装任何珠装等级为1的珠

第2个装备有L=1和L=2的孔,

        在第一个孔上可以选择不安装任何珠装等级为1的珠

        在第二个孔上可以选择不安装任何珠装等级为1的珠等级为2的珠

第3个装备有1个L=1孔

        在第一个孔上可以选择不安装任何珠,装等级为1的珠。

第4个装备有2个L=2的孔

        在第一个孔上可以选择不安装任何珠装等级为1的珠等级为2的珠

        在第二个孔上可以选择不安装任何珠装等级为1的珠等级为2的珠

第5个装备有1个L=1的孔

        在该孔上可以选择不安装任何珠装等级为1的珠

第6个装备上有1个L=3的孔

        在该孔上可以选择不安装任何珠装等级为1的珠,装等级为2的珠,或装等级为3的珠

当遍历完所有的孔之后,会得到一种装饰珠的组合,根据该组合的珠的数量可求得该组合对应的价值。记录所有组合中的最大值即为所求解。

如其中最大的组合:

装备1:孔1--L=1的珠

装备2:孔1--L=1的珠,孔2--L=2的珠

装备3:孔1--L=1的珠

装备4:孔1--L=2的珠,孔2--L=2的珠

装备5:孔1--L=1的珠

装备6:孔1--L=2的珠

伪代码

int ans = 0;
int test(int[][] arr){
    
    //装饰珠的等级为[0,1,2,3,4] 0表示不安装装饰珠
    int[] res = new int[5];
        
    rec(arr,0,res);

    return ans;
}


//arr表示所有的装备,每个一维数组表示每个装备所有的孔的等级(可能会有无效空间,因为一维数组的长度由装备中某个最多孔的数量决定的。)
//index表示当前遍历到第几件装备
//res表示选择的组合结果
void rec(int[][] arr,int index,int[] res){
    if(index到头了){
        根据res中的结果,计算之前选择的珠的组合所对应的价值。(如4个L=1、4个L=2、1个L=3的珠)
        ans = Math.max(ans,res中的结果);

        return;
    }


    for(int i = 0;i < arr[0].length;i++){
        if(arr[index][i] == -1){
            //当前装备的孔已经遍历完了
            break;
        }

        //遍历当前装备的第j个孔的等级范围,
        //(如L=2,j的范围为[0,1,2],0表示不安装孔,1表示安装L=1的孔,2表示安装L=2的孔)
        for(int j = 0;j <= arr[index][i];j++){

            //等级为j的装饰珠数量++
            res[j]++;

            rec(arr,index+1,res);

            //等级为j的装饰珠数量--
            res[j]--;
        }
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LXJ6379

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

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

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

打赏作者

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

抵扣说明:

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

余额充值