蓝桥杯健身题目:

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];//返回最大健身收益(价值),即二维数组最后一个元素
    }
}

 

posted on 2025-05-17 21:06  fafrkvit  阅读(8)  评论(0)    收藏  举报