首页 > 试题广场 >

代金券组合

[编程题]代金券组合
  • 热度指数:3127 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

近期某商场由于周年庆,开启了“0元购活动。活动中,消费者可以通过组合手中的代金券,实现0元购买指定商品。

聪明的小团想要用算法来帮助他快速计算:对于指定价格的商品,使用代金券凑出其价格即可,但所使用的代金券总面额不可超过商品价格。由于代金券数量有限,使用较少的代金券张数则可以实现价值最大化,即最佳优惠。

假设现有100元的商品,而代金券有50元、30元、20元、5元四种,则最佳优惠是两张50元面额的代金券;而如果现有65元的商品,则最佳优惠是两张30元代金券以及一张5元代金券。

请你帮助小团使用一段代码来实现代金券计算。


输入描述:
多组输入输出,读到s=0时结束
输入可以有多个测试样例,每个测试由两行组成。

其中第一行包含一个整数P,表示商品的价格,1≤P≤10000;输入P为0时表示结束。

第二行包含若干整数,使用空格分割。其中第一个整数N(1≤N≤20)表示有多少种代金券,其后跟随M个整数,表示手中持有的代金券面额(1≤N≤1000),每种代金券数量不限。



输出描述:

找到最少张数的代金券,使其面额恰好等于商品价格。输出所使用的代金券数量;

如果有多个最优解,只输出其中一种即可;

如果无解,则需输出“Impossible”。

示例1

输入

65
4 50 30 20 5
0

输出

3
//java代码
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {//可以用来判断是否有下一个整数
            int n = in.nextInt();
                        if(n == 0) break;
            if (in.hasNextInt()) {//如果还有下一个数,可以将其放入变量x中
                int x = in.nextInt();
                int arr[] = new int[x + 1];
                for (int i = 0; i < x; i++) {
                    arr[i] = in.nextInt();
                }
                int dp[] = new int[n + 1];
                Arrays.fill(dp, n + 1);
                dp[0] = 0;
                for (int i = 1; i <= n; i++) {
                    for (int j = 0; j < x; j++) {
                        if (arr[j] <= i) dp[i] = Math.min(dp[i], dp[i - arr[j]] + 1);
                    }
                }
                System.out.println(dp[n] > n ? "Impossible" : dp[n]);
            }

        }
    }
}


发表于 2023-04-05 17:57:30 回复(0)