題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=2546

思路分析:該問題為0-1揹包問題的變形題;問題求餘額最少,設開始的餘額為V,則求得用V-5可以買到的菜的最大價值,最後留下的5元則用來買菜價最高的菜,可以證明這種購買方式是能夠產生最優解的;另外,因為題目要求所有的菜只能買一次,所以在求V-5能買最多價值的菜時不能買菜價最高的菜,因為菜價最高的菜一定是用剩下的5元錢來購買的;

程式碼如下:

import java.util.*;

public class Main {
static final int MAX_N = 1000 + 10;
static int[] c = new int[MAX_N];
static int[] dp = new int[MAX_N]; static int Max(int a, int b) {
return a > b ? a : b;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N, V; while ((N = in.nextInt()) != 0) {
int max_value = 0; Arrays.fill(dp, 0);
for (int i = 0; i < N; ++ i) {
c[i] = in.nextInt();
if (c[i] > max_value)
max_value = c[i];
}
Arrays.sort(c, 0, N);
V = in.nextInt();
for (int i = 0; i < N - 1; ++ i) {
for (int v = V - 5; v >= c[i]; -- v) {
dp[v] = Max(dp[v], dp[v - c[i]] + c[i]);
}
}
if (V < 5)
System.out.println(V);
else
System.out.println(V - dp[V-5] - c[N - 1]);
}
}
}