poj 3181 Dollar Dayz 整数划分问题

来源:互联网 发布:c#开发windows程序 编辑:程序博客网 时间:2024/06/03 08:39
ime Limit: 1000MS Memory Limit: 65536K
Total Submissions: 3530 Accepted: 1401

Description
Farmer John goes to Dollar Days at The Cow Store and discovers an unlimited number of tools on sale. During his first visit, the tools are selling variously for $1, $2, and $3. Farmer John has exactly $5 to spend. He can buy 5 tools at $1 each or 1 tool at $3 and an additional 1 tool at $2. Of course, there are other combinations for a total of 5 different ways FJ can spend all his money on tools. Here they are:

1 @ US$3 + 1 @ US$2

1 @ US$3 + 2 @ US$1

1 @ US$2 + 3 @ US$1

2 @ US$2 + 1 @ US$1

5 @ US$1

Write a program than will compute the number of ways FJ can spend N dollars (1 <= N <= 1000) at The Cow Store for tools on sale with a cost of $1..$K (1 <= K <= 100).

Input
A single line with two space-separated integers: N and K.

Output
A single line with a single integer that is the number of unique ways FJ can spend his money.

Sample Input

5 3

Sample Output

5

整数划分是把一个正整数 N 拆分成一组数相加并且等于 N 的问题.

假设F(N,M) 整数 N 的划分个数,其中 M 表示将 N 拆分后的序列中最大数

dp[n][m]= dp[n][m-1]+ dp[n-m][m]  当m<=n时, 否则就等于dp[n][MAXM]
           
           dp[n][m]表示整数 n 的划分中,每个数不大于 m 的划分数。
           则划分数可以分为两种情况:
 
           a. 划分中每个数都小于 m, 相当于每个数不大于 m- 1, 故
              划分数为 dp[n][m-1].
 
           b. 划分中有一个数为 m. 那就在 n中减去 m , 剩下的就相当
              于把 n-m 进行划分, 故划分数为 dp[n-m][m];

由于结果巨大,long long 存不下,故考虑用Java的大整数类

边界处理好就没问题了

import java.math.BigInteger;import java.util.Scanner;public class Main {static final int maxn = 1000 + 5;static final int maxk = 100 + 5;static BigInteger dp[][]=new BigInteger[maxk][maxn];static void solve(){for (int i = 0; i < maxk; i++) dp[i][0] = BigInteger.ONE;for (int i = 1; i < maxn; i++) dp[0][i] = BigInteger.ZERO;for (int i = 1; i < maxk; i++){for (int j = 1; j < maxn; j++){if (j >= i) dp[i][j] = dp[i - 1][j].add(dp[i][j - i]);else dp[i][j] = dp[i - 1][j];}}}public static void main(String[] args){Scanner sc = new Scanner(System.in);int n, k;solve();while (sc.hasNext()){n = sc.nextInt();k = sc.nextInt();System.out.println(dp[k][n]);}}}




0 0
原创粉丝点击