思路

凑硬币原题。考点是完全背包,即每种物品可以选无限个

定义 f[j] 表示前 个物品中选择物品总面值为 时的总硬币数。

定义状态转移方程:f[j] = max(f[j], f[j - features[i]] + 1)。即考虑从之前的状态中比较面值为 和面值为 硬币的数量。如果选择前者,则表示不选择当前面值的硬币,否则选择当前面值的硬币,然后加

时间复杂度为 ,空间复杂度为 ,其中 为物品数量, 为背包容量。

参考代码
import java.util.*;


public class Solution {
    final int INF = 0x3f3f3f3f;
    
    public int minAnimalCount (int[] features, int target) {
        int[] f = new int[target + 1];
        int n = features.length;
        
        Arrays.fill(f, INF);
        f[0] = 0;
        for (int i = 0; i < features.length; i++) {
            for (int j = features[i]; j <= target; j++) {
                f[j] = Math.min(f[j], f[j - features[i]] + 1);
            }
        }

        return f[target] == INF ? -1 : f[target];
    }
}