点菜问题

点菜问题_第1张图片

这是一道北京大学的研究生机试题,入门的一道动态规划题,和我之前写的另一篇文章解法一样,详情参考《做小偷也要会动态规划——轻松解决"01背包问题"》,这里直接贴出代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int C = scanner.nextInt();
            int N = scanner.nextInt();
            int[] value = new int[N + 1];
            int[] score = new int[N + 1];
            for (int i = 1; i < N + 1; i++) {
                value[i] = scanner.nextInt();
                score[i] = scanner.nextInt();
            }

            int[][] dp = new int[N + 1][C + 1];
            for (int i = 1; i < N + 1; i++) {
                for (int j = 1; j < C + 1; j++) {
                    if (value[i] > j) {
                        dp[i][j] = dp[i - 1][j];
                    } else {
                        int a = dp[i - 1][j - value[i]] + score[i];
                        int b = dp[i - 1][j];
                        dp[i][j] = Math.max(a, b);
                    }
                }
            }
            System.out.println(dp[N][C]);
        }
    }
}

你可能感兴趣的:(点菜问题)