题意 : 给出目标金额 N ,问你用面额 1~K 拼成 N 的方案有多少种
分析 :
完全背包的裸题,完全背包在 DP 的过程中实际就是列举不同的装填方案数来获取最值的
故状态转移方程为 dp[i] += dp[j-w[i]]
但是这题怎么可能那么简单呢! N 和 K 的上限导致答案过大,需要使用高精度加法来完成
所以无耻的用 JAVA 来搞定了
import java.io.*; import java.lang.reflect.Array; import java.util.*; import java.math.*; import java.util.Arrays; public class Main { static BigInteger[] dp = new BigInteger[1111]; public static void main(String[] args){ Scanner cin = new Scanner (new BufferedInputStream(System.in)); int N, K; while(cin.hasNext()){ N = cin.nextInt(); K = cin.nextInt(); for(int i=0; i<=N; i++) dp[i] = BigInteger.ZERO; dp[0] = BigInteger.ONE; for(int i=1; i<=K; i++) for(int j=i; j<=N; j++) dp[j] = dp[j].add(dp[j-i]); System.out.println(dp[N]); } } }