蓝桥杯健身题目:

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
import java.util.*;
//本题是动态规划中完全背包的算法,main方法中做的主要是算出分出的每块背包(每块连续的健身天数),然后对于capacity数组中每一个容量调用方法,把总收益累加并输出、
//要着重注意数组是否越界,还要看清楚题目是01背包问题还是完全背包问题
//如果忘了这个背包问题代码,可以回忆一下这个算法的过程和它二维数组长啥样,分别是背包的容量(从0开始),商品的序号(从0开始)
public class Q6 {
public static void main(String []args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();//总共的天数
int m=sc.nextInt();//健身计划个数
int q=sc.nextInt();//有其它安排的天数
int []capacity=new int[q+1];//因为是切割,所以除去默认为的部分,还要再+1
int []arr1=new int[q+2];
arr1[q+1]=n+1;
for(int i=1;i<q+1;i++){
arr1[i]=sc.nextInt();
}
for(int i=0;i<capacity.length;i++){
capacity[i]=arr1[i+1]-arr1[i]-1;//计算每段空闲的天数容量
}
int []w=new int[m];
int []v=new int[m];
for(int i=0;i<m;++i){
w[i]=(int)Math.pow(2,sc.nextInt());
v[i]=sc.nextInt();
}
long sum=0;
for(int i=0;i<capacity.length;i++){
sum+=package1(w,v,capacity[i]);
}
System.out.println(sum);
}
public static long package1(int []w,int[]v,int capacity){//背包问题的代码,参数为健身计划的天数(重量),健身计划收益(价值),可用的连续空余时间(背包空间)
if(capacity==0)
return 0;//如果背包容量为0,收益返回0
long [][]value=new long[w.length+1][capacity+1];//因为第value[0]列和value[][0]行都为0
for(int i=1;i<w.length+1;i++)
for(int j=1;j<capacity+1;j++){
if(w[i-1]>j)
value[i][j]=value[i-1][j];
else
value[i][j]=Math.max(value[i-1][j],v[i-1]+value[i][j-w[i-1]]);//完全背包和01背包代码区别,01背包此处:v[i-1]+value[i-1][j-w[i-1]],即不能重复购买
}
return value[w.length][capacity];//返回最大健身收益(价值),即二维数组最后一个元素
}
}
浙公网安备 33010602011771号