POJ 3628 Bookshelf 2

来源:互联网 发布:淘宝类的app难做么 编辑:程序博客网 时间:2024/06/18 16:31

题目链接:http://poj.org/problem?id=3628

题目大意:给出n和b,然后给出n个数,用这n个数中的某些,求出一个和,这个和是>=b的最小值,输出最小值与b的差。

解题思路:
1、dfs,2^20次方
2、dp,状态方程dp[j] |= dp[j-h[i]],如果dp[j-h[i]]能够凑出来,那么dp[j]也可以凑出来,最后扫一遍找到第一个dp[j]为true的值

ps:这个题的N和最大Sum都很大,dp不如枚举,如果后台数据量大dp肯定过不了2333……

import java.util.Scanner;/** * Created by sdust on 2017/5/11. */public class Main {    public static void main(String[] args) {        int n, b;        Scanner scanner = new Scanner(System.in);        n = scanner.nextInt();        b = scanner.nextInt();        int h[] = new int[n+5];        int sum = 0;        for(int i = 0; i < n; ++i) {            h[i] = scanner.nextInt();            sum += h[i];        }        boolean f[] = new boolean[sum + 5];        int flag = 0;        f[0] = true;        for(int i = 0; i < n; ++i) {            for(int j = sum; j >= h[i]; --j) {                f[j] |= f[j-h[i]] ;            }        }        for(int i = b; i <= sum; ++i) {            if(f[i]) {                System.out.println(i - b);                break;            }        }    }}
0 0