AcWing 900. 看得懂记不住
原题链接
简单
作者:
季之秋
,
2021-02-10 22:13:52
,
所有人可见
,
阅读 296
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int f[][]=new int[1010][1010];
int mod=1000000000+7;
for(int i=0;i<=n;i++) f[i][0]=1; //状态表示里 i个数里凑出0只有一种方法,就是一个数都不出现
//可是0个数里凑i凑不出来,所以是0,默认初始化了
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(j>=i) f[i][j]=(f[i-1][j]+f[i][j-i])%mod; //负数的肯定凑不出来,为0次,
else f[i][j]=f[i-1][j]%mod; //但是另一个值存在,所以判断一下
}
}
System.out.println(f[n][n]); //前n个数里正好加起来等于n的数量
/*
f[1][1]=1; //1个数的和为1,只有一个,就是1
//f[i][0] 0个数和为0,可以=1,但是循环里访问不到这个数,就没必要赋值
for(int i=2;i<=n;i++){ //i=1,f[1][j]j个数和是1 所以j>1的都是0,j=1的f[1][1]已经等于1了;
for(int j=1;j<=i;j++){ //i最多拆成i个1之和,
f[i][j]=f[i-1][j-1]+f[i-j][j]%mod;
}
}
int res=0;
for(int i=1;i<=n;i++) res+=f[n][i]%mod; //和是n的都可以算,
System.out.println(res);
*/
}
}