zoukankan      html  css  js  c++  java
  • [编程题]代金券组合

    近期某商场由于周年庆,开启了“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

    输出例子1:
    3

    let sum;
    while ((sum = parseInt(readline())) != 0) {
        let arr = readline().split(' ');
         let dj = [];
        for (let i = 1; i < arr.length; i++) {
            dj.push(parseInt(arr[i]));
        };
        dj.sort((a, b) => (a - b));
        function al(dj, target) {
            let jc = [new Array(dj.length)];
            jc[0][0] = 0;
            for (let i = 1; i <= target; i++) {
                if (i % dj[0] == 0) {
                    jc[0][i] = parseInt(i / dj[0]);
                } else {
                    jc[0][i] = 0;
                }
            }
            for (let i = 1; i < dj.length; i++) {
                jc[i]=[0];
            }
            for (let i = 1; i < dj.length; i++) {
                for (let j = 1; j <= target; j++) {
                    if (j < dj[i]) {
                        jc[i][j] = jc[i - 1][j];
                    } else if (j == dj[i]) {
                        jc[i][j] = 1;
                    } else {
                        if (jc[i - 1][j] != 0 && jc[i][j - dj[i]] != 0) {
                            jc[i][j] = Math.min(jc[i - 1][j], jc[i][j - dj[i]]+1);
                        } else {
                            jc[i][j] = 0;
                            if (jc[i - 1][j] != 0) {
                                jc[i][j] = jc[i - 1][j];
                            }
                            if (jc[i][j - dj[i]] != 0) {
                                jc[i][j] = jc[i][j - dj[i]] + 1;
                            }
                        }
                    }
                }
            }
            if (jc[dj.length - 1][target] == 0) {
                return 'Impossible';
            } else {
                return jc[dj.length - 1][target];
            }
    
        }
        console.log(al(dj, sum));
        
    }   
  • 相关阅读:
    正确添加Google Adsense
    微软开发主管临别诤言
    DZ论坛重建管理员
    Cook book 第4天 第6章 层、自定义组件
    Cook Book 第二天 运行环境识别修改
    flex cookbook 学习第一天 基本知识
    C#:String类型中的CharAt
    对我学C#时的一次小回忆[一:语法篇]
    分享一段C#反射代码[Type是反射的入口][查看类型信息][动态生成对象]
    C#反射:让私有成员无所遁形
  • 原文地址:https://www.cnblogs.com/shengliuyang/p/12445546.html
Copyright © 2011-2022 走看看