左神算法之中级提升(5) 背包问题

目录

【案例1】

【题目描述】

 【思路解析】

【代码实现】

 【案例2】 【 2019 网易面试题】

【题目描述】

【思路解析】

【代码实现】

【案例3】

【题目描述】

 【思路分析】

【代码实现】


【案例1】

【题目描述】

左神算法之中级提升(5) 背包问题_第1张图片

 【思路解析】

背包问题:

左神算法之中级提升(5) 背包问题_第2张图片

【代码实现】

 

/**
 * @ProjectName: study3
 * @FileName: Ex6
 * @author:HWJ
 * @Data: 2023/7/13 12:15
 */
public class Ex6 {
    public static void main(String[] args) {
        int[] v = {3,2,5,2,3};
        System.out.println(getWays(v, 10));
    }

    public static int getWays(int[] v, int w){
        int[][] dp = new int[v.length][w + 1];
        dp[0][0] = 1;
        dp[0][v[0]] = 1;
        for (int i = 1; i < dp.length; i++) {
            for (int j = 0; j <= w; j++) {
                if (j >= v[i]){
                    dp[i][j] = dp[i-1][j] + dp[i-1][j - v[i]];
                }else {
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        int res = 0;
        for (int i = 0; i <= w; i++) {
            res += dp[v.length - 1][i];
        }
        return res;
    }


}

 【案例2】 【 2019 网易面试题】

【题目描述】

左神算法之中级提升(5) 背包问题_第3张图片

 同一个工作,可以去无数个人。

【思路解析】

先将工作按照难度排序,然后就得到了所有工作在不同难度上的最优解,有序表中存放相同难度利益最大的那个,然后再满足有序表中的工作难度增大时,利益同时增大的表。

【代码实现】

import java.util.*;

/**
 * @ProjectName: study3
 * @FileName: Ex7
 * @author:HWJ
 * @Data: 2023/7/13 13:31
 */
public class Ex7 {
    public static void main(String[] args) {
        Job job = new Job(5, 3);
        Job job1 = new Job(14, 6);
        Job job2 = new Job(12, 5);
        Job job3 = new Job(9, 3);
        Job job4 = new Job(25, 8);
        Job job5 = new Job(15, 7);
        Job job6 = new Job(14, 11);
        Job job7 = new Job(5, 2);
        Job job8 = new Job(6, 9);
        Job[] jobs = {job,job1,job2,job3,job4,job5,job6,job7,job8};
        int[] ability = {1,5,74,5,6,24,5,6,3,2,1,4,5,8,9,7,15,2,25,624,24};
        System.out.println(Arrays.toString(salary1(jobs, ability)));
        System.out.println(Arrays.toString(salary2(jobs, ability)));
    }

    public static class Job {
        public int money;
        public int hard;

        public Job(int money, int hard) {
            this.money = money;
            this.hard = hard;
        }
    }

    // 使用有序表做
    public static int[] salary1(Job[] jobs, int[] ability) {
        Arrays.sort(jobs, new Comparator() {
            @Override
            public int compare(Job o1, Job o2) {
                return o1.hard != o2.hard ? o1.hard - o2.hard : o2.money - o1.money;
            }
        });
        TreeMap map = new TreeMap<>();
        map.put(jobs[0].hard, jobs[0].money);
        Job pre = jobs[0];
        for (int i = 1; i < jobs.length; i++) {
            if (jobs[i].hard > pre.hard && jobs[i].money > pre.money) {
                pre = jobs[i];
                map.put(pre.hard, pre.money);
            }
        }
        int[] res = new int[ability.length];
        for (int i = 0; i < res.length; i++) {
            Integer key = map.floorKey(ability[i]);
            res[i] = key == null ? 0 : map.get(key);
        }
        return res;
    }
    
}

【案例3】

【题目描述】

 【思路分析】

总结日常书写形式的规范:

(1)数字之外只允许有减号‘-’出现。

(2)如果有‘-’,只能在开头,并且只能出现一次,且后面必须跟数字,但数字不能是0.

(3)如果开头数字是0,后面不能在出现字符了。

如果这个字符串合法,转为int类型数字时,需要时刻判断是否越界了。又因为int负数的值更大,所以我们统一将所有的数刚开始都转为负数,然后再转为相应的值。

【代码实现】

/**
 * @ProjectName: study3
 * @FileName: Ex8
 * @author:HWJ
 * @Data: 2023/7/13 14:03
 */
public class Ex8 {
    public static void main(String[] args) {

    }

    public static boolean convert(String strs) {
        char[] str = strs.toCharArray();
        if (str[0] == '-' && (str.length == 1 || str[1] == '0')) {
            return false;
        }
        if (str[0] != '-' && (str[0] > '9' || str[0] < '0')) {
            return false;
        }
        if (str[0] == '0' && str.length > 1) {
            return false;
        }
        for (int i = 1; i < str.length; i++) {
            if (str[i] > '9' || str[i] < '0') {
                return false;
            }
        }
        return true;
    }
}

你可能感兴趣的:(算法,动态规划)