设有6 种不同面值的硬币,各硬币的面值分别为5 分,1 角,2 角,5 角,1 元,2元。现要用这些面值的硬币来购物。在购物中希望使用最少个数硬币。例如,1 次购物需要付款0.55 元,如果没有5 角的硬币,只好用2*2角+1*1角+1*5分 共4 枚硬币来付款。 对于给定的各种面值的硬币个数和付款金额,计算使用硬币个数最少的交易方案。 输入格式: 输入数据有若干组,第一行给出一个整数n表示输入数据的组数。 以下n行每一行有6 个整数和1个有2 位小数的实数。分别表示可以使用的各种面值的硬币个数和付款金额。 输出格式: 输出每组数据的最少硬币个数。如果不可能完成交易,则输出“impossible”。 写出java代码
时间: 2024-02-01 15:15:16 浏览: 30
[附答案]计算出需要的各种面值的钱币的类型及数量
```
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
while (n-- > 0) {
int[] cnt = new int[7];
int sum = 0;
for (int i = 1; i <= 6; i++) {
cnt[i] = in.nextInt();
sum += cnt[i] * i;
}
double pay = in.nextDouble();
int target = (int) (pay * 100 + 0.5);
if (sum < target) {
System.out.println("impossible");
continue;
}
int[] dp = new int[target + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
int[] coins = {0, 5, 10, 20, 50, 100, 200};
for (int i = 1; i <= 6; i++) {
for (int j = 1; j <= cnt[i]; j++) {
for (int k = target; k >= coins[i]; k--) {
dp[k] = Math.min(dp[k], dp[k - coins[i]] + 1);
}
}
}
if (dp[target] == Integer.MAX_VALUE) {
System.out.println("impossible");
} else {
System.out.println(dp[target]);
}
}
}
}
```
阅读全文