如何使子阵列的总和是最小系数的零(类似于硬币改变算法)

时间:2017-06-17 14:29:41

标签: arrays algorithm sorting hashmap coin-change

我想知道如何表达每个系数的最小总和。 Sum必须为零,并且列表的整数可以与每个系数相乘。

例如:( - 5, - 2,3,7)将总和设为0,

如果-5具有系数2,则 3有系数1, 7具有系数1 然后-5 * 2 + 3 * 1 + 7 * 1 = 0,系数之和为2 + 1 + 1 = 4.

另外,如果-5具有系数1,则 -2有系数1, 7具有系数1 然后-5 * 1 +( - 2 * 1)+ 7 * 1 = 0,系数之和为1 + 1 + 1 = 3.

因此,最小系数之和为3.

我认为这个问题可以像硬币改变算法一样解决。

所以我决定修改硬币改变算法代码。 以下是硬币更改算法示例代码。

之前我使用了arraylist,然后,我看到了建议,所以我修改了代码,就像使用hashmap一样。但是,问题是硬币包含( - )减去值,并且sum必须为零,所以下面的代码出现错误。

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map.Entry;

public class CoinChange {

    public static void main(String[] args) {
        int[] coins = {-37,35,2,5};       
        int amt = 0;       
        makeChange(coins, amt); 
    }

    public static void makeChange(int[] coins, int amount){
        //Sorting the coins
        Arrays.sort(coins);//[-37, 2, 5, 35]
        //System.out.println(Arrays.toString(coins));
        //System.out.println(amount);

        int n = coins.length - 1;


        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();

        while(amount > 0)
        {
            if(coins[n] <= amount)
            {
                int val = 1;
                if(map.containsKey(coins[n]))
                {
                    val = map.get(coins[n]);
                    val = val+1;
                }

                map.put(coins[n], val);

                amount = amount - coins[n];

            }
            else
            {
                n--;
            }

        }

        for(Entry<Integer, Integer> entry: map.entrySet()){

            System.out.println(entry.getKey() +":" + entry.getValue());
        }
    }
}

0 个答案:

没有答案