Codeforces 417A - Elimination【完全背包】

题目链接
题目简介:
淘汰赛分 主淘汰赛次淘汰赛
主淘汰赛有 c 个问题,每轮产生 n 个获胜者
次淘汰赛有 d 个问题,每轮产生 1 个获胜者
需要从两种淘汰赛中选出 n*m 个选手参加总决赛
并且有 k 个往届总决赛的获奖选手不需参加淘汰赛即可进入总决赛
问通过组织以上两种淘汰赛选出 n*m 名选手(含往届的 k 名选手)参加总决赛所需问题的最少数目

典型的完全背包问题

java实现如下:

import java.util.Scanner;

public class Main {

    static int c, d, n, m, k, v, dp[];

    //完全背包
    static void f_full(int cost, int val) {
        for (int i = cost; i <= v; i++)
            dp[i] = Math.max(dp[i], dp[i - cost] + val);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        c = sc.nextInt();
        d = sc.nextInt();
        n = sc.nextInt();
        m = sc.nextInt();
        k = sc.nextInt();
        int temp = n * m;
        if (k < temp) {
            
            //预设可取的背包空间
            v = Math.min(c * m, temp * d);
            dp = new int[v + 1];
            
            //初始化dp[0]为k
            dp[0] = k;
            
            //只有两种方案
            f_full(c, n);
            f_full(d, 1);
            
            int i = 1;
            for (; i <= v; i++) {
                if (dp[i] >= temp)
                    break;
            }
            System.out.println(i);
        } else
            System.out.println(0);
    }
}

你可能感兴趣的:(Codeforces 417A - Elimination【完全背包】)