Ignatius and the Princess III
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10679 Accepted Submission(s): 7569
"The second problem is, given an positive integer N, we define an equation like this:
N=a[1]+a[2]+a[3]+...+a[m];
a[i]>0,1<=m<=N;
My question is how many different equations you can find for a given N.
For example, assume N is 4, we can find:
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
so the result is 5 when N is 4. Note that "4 = 3 + 1" and "4 = 1 + 3" is the same in this problem. Now, you do it!"
4 10 20
5 42 627
经典的算法之一-------整数划分问题
可以用递归法,母函数法,
递归法
import java.util.Scanner;
public class hdu1028整数划分 {
static long[][]a=new long[122][122];
private static long fun(int n,int m) {
if(a[n][m]!=0)return a[n][m];
if(n<1||m<1)return 0;
if(n==1||m==1)return 1;
if(n<m) return a[n][m]=fun(n,n);
if(n==m) return a[n][m]=1+fun(n,n-1);
return a[n][m]=fun(n,m-1)+fun(n-m,m);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
System.out.println(fun(n,n));
}
}
}
POJ1644放苹果
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 24361 | Accepted: 15493 |
Description
Input
Output
Sample Input
1 7 3
Sample Output
8
Source
import java.util.Scanner;
public class poj放苹果_整数划分变化 {
//1983210400 1664 Accepted 3000K 125MS Java 581B 2013-11-27 14:45:43
/**
* @param args
*/
static int a,b;
static int[][]s=new int[25][25];
public static int f(int n,int m){
if(s[n][m]!=0)return s[n][m];
if(n<1||m<1) return 0;
if(n==1||m==1) return 1;
if(n<m) return s[n][m]=f(n,n);
if(n==m)return s[n][m]=1+f(n,n-1);
return s[n][m]=f(n,m-1)+f(n-m,m);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
while(N-->0){
a=sc.nextInt();
b=sc.nextInt();
System.out.println(f(a,b));
}
}
}
DP方法:大牛提供
import java.util.Scanner;
public class poj1664放苹果_整数划分变化{
//网上看到的,动态规划方法
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int []dp;
int N=sc.nextInt();
while(N-->0){
int m=sc.nextInt();//苹果
int n=sc.nextInt();//盘子
dp=new int [50];
dp[0]=1;
for(int i=1;i<=n;i++)//盘子
for(int j=i;j<=m;j++){//苹果
dp[j]+=dp[j-i];
}
System.out.println(dp[m]);
}
}
}
POJ3014
Time Limit: 5000MS | Memory Limit: 131072K | |
Total Submissions: 6444 | Accepted: 2013 | |
Case Time Limit: 1000MS |
Description
kcm1700, ntopia, suby, classic, tkwons, and their friends are having a birthday party for kcm1700. Of course, there is a very large birthday cake. They divide the birthday cake into undistinguishable pieces and put them on identical plates. kcm1700 is curious, so he wants to know how many ways there are to put m cake pieces on n plates.
Input
In the only input line, there are two integers n, m (1 ≤ n, m ≤ 4 500), which are the number of the plates and the number of the cake pieces respectively.
Output
If the number of ways is K, just output K mod 1000000007 because K can be very large.
Sample Input
3 7
Sample Output
8
Hint
There are 8 ways to fill 3 plates with 7 cakes, namely (0,0,7), (0,1,6), (0,2,5), (0,3,4), (1,1,5), (1,2,4), (1,3,3), (2,2,3).
Source
import java.util.Scanner;
public class poj1664放苹果_整数划分变化{
//网上看到的,动态规划方法
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int []dp;
int N=sc.nextInt();
while(N-->0){
int m=sc.nextInt();//苹果
int n=sc.nextInt();//盘子
dp=new int [50];
dp[0]=1;
for(int i=1;i<=n;i++)//盘子
for(int j=i;j<=m;j++){//苹果
dp[j]+=dp[j-i];
}
System.out.println(dp[m]);
}
}
}