思路:题意是要我们计算最后饭卡最少能剩多少钱,>=5可以随意买,因此,要想办法使得没买最后一个东西前,余额尽可能逼近5,反言之就是初始金额m和5的差值,相当于背包的容量,我们尽可能装满。
为了达到最后余额最小的目的,先对价格排序,把价格最高的留到最后扣。、
代码:dp[j]表示容量为j时,最多能花多少钱
import java.util.*;
public class Main{
static Scanner sc = new Scanner(System.in);
static int n;
static int [] dp;
static int [] w;
public static void main(String[] args) {
while(sc.hasNext()) {
n = sc.nextInt();
if(n == 0) break;
w = new int[n+1];
for(int i = 1; i <= n; i++)
w[i] = sc.nextInt();
Arrays.sort(w);
int m = sc.nextInt();
dp = new int[m+1];
if(m < 5)
System.out.println(m);
else {
for(int i = 1; i < n; i++) {//少循环一次,最大的留到最后减,否则会多减一次
for(int j = m-5; j >= w[i]; j--) {//背包容量不小于w[i],否则减不了
dp[j] = Math.max(dp[j-w[i]]+w[i], dp[j]);
}
}
System.out.println(m - dp[m-5]-w[n]);
}
}
System.exit(0);
}
}
开始复习下背包问题吧