题意:存钱罐可以往里面放一些价值小的钱,但是时间久了就不知道里面有多少钱了,除非你打破它。现在给出空罐子的重量和最满能装到多重,然后给出每种硬币的价值和重量,我们要在不打破它的情况下确认罐子里最少有多少钱。
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int T = scanner.nextInt();
for (int k = 0; k < T; k++) {
int n = scanner.nextInt();
int m = scanner.nextInt();
int t = scanner.nextInt();
int w[] = new int[t];
int p[] = new int[t];
for (int i = 0; i < t; i++) {
p[i] = scanner.nextInt();
w[i] = scanner.nextInt();
}
int f[] = bao(m - n, w, p);
if (f[f.length - 1] == 9999999) {
System.out.println("This is impossible.");
} else {
System.out.println("The minimum amount of money in the piggy-bank is " + f[f.length - 1] + ".");
}
}
}
}
public static int[] bao(int m, int[] w, int[] p) {
int f[] = new int[m + 1];
Arrays.fill(f, 9999999);//先装满
f[0] = 0;
for (int i = 0; i < p.length; i++) {
for (int j = w[i]; j < f.length; j++) {
f[j] = Math.min(f[j], f[j - w[i]] + p[i]);
}
}
return f;
}
}