算法练习(十三)背包算法(动态规划)

文章描述了一种计算核酸检测效率的方法,考虑了采样员和志愿者的配合对效率的影响。每名采样员的效率不同,效率会以N的10%为粒度变化。每增加一名志愿者,采样员的效率可提升1到3倍的浮动粒度。通过动态规划的算法实现,找出最优的志愿者分配策略,以达到最快的总检测效率。
摘要由CSDN通过智能技术生成

一、核酸检测人员安排

1、题目描述: 在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。每名采样员的效率不同,采样效率为N人/小时。由于外界变化,采样员的效率会以M人/小时为粒度发生变化,M为采样效率浮动粒度,M=N10%,输入保证N10%的结果为整数。采样员效率浮动规则:采样员需要一名志愿者协助组织才能发挥正常效率,在此基础上,每增加一名志愿者,效率提升1M,最多提升3M;如果没有志愿者协助组织,效率下降2M。
怎么安排速度最快?求总最快检测效率(总检查效率为各采样人员效率值相加)。

2、示例如下:
在这里插入图片描述

3、代码如下:
在这里插入图片描述

import java.util.*;

//背包算法,画个表格就理解过程了
public class heSuanJianCe {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt();
        int V=sc.nextInt();
        int[] nums=new int[N];
        for (int i=0;i<N;i++){
            nums[i]=sc.nextInt();   //采集员采样效率
        }
        int[] arrM=new int[N];
        for(int i=0;i<N;i++){
            arrM[i]=nums[i]/10;     //采集员浮动效率
        }
        int[][] dp=new int[N+1][V+1];
        int count=0;
        for (int i=1;i<N+1;i++){
            count+=(nums[i-1]-2*arrM[i-1]);
            dp[i][0]=count;     //没有志愿者的采集员采样效率
        }
        for(int i=1;i<N+1;i++){ //一排一排打印结果
            for(int j=1;j<V+1;j++){
                dp[i][j]=Math.max(dp[i-1][j]+nums[i-1]-2*arrM[i-1],dp[i-1][j-1]+nums[i-1]);     //剩下的志愿者大于等于1时,以下同理
                dp[i][j]=Math.max(dp[i][j],j-2>=0?dp[i-1][j-2]+nums[i-1]+arrM[i-1]:0);
                dp[i][j]=Math.max(dp[i][j],j-3>=0?dp[i-1][j-3]+nums[i-1]+2*arrM[i-1]:0);
                dp[i][j]=Math.max(dp[i][j],j-4>=0?dp[i-1][j-4]+nums[i-1]+3*arrM[i-1]:0);
            }
        }
        System.out.println(dp[N][V]);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值