解题思路
看懂题意之后发现挺简单的。
猎人有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]--;
}
}
}