UVA 10943 - How do you add?
2016-07-18 01:46
405 查看
题目链接
题目解析
题意
输入整数N和K,将N分成K个不超过N的非负整数的和的形式,求解有多少种组合方式,当输入的两个数N和K都为0时,程序结束。思路
法一(隔板法):启发于博客
题目等价于将N个相同的小球,放入K个不同的盒子中,盒子可以为空,求解有多少种放法。转化为将N+K个相同的小球,放入K个不同的盒子中,每个盒子至少有一个小球;在N+K-1个空当里插入K-1个隔板,共有C(N+K-1,K-1)种插法。
C(n,m)=C(n-1,m-1)+C(n-1,m)
memset函数
内存填充函数,能对一片内存空间进行初始化,逐字节地把数组设定为一个指定的数
void *memset(void *s,int c,size_t n)
将已开辟内存空间 s 的前 n 个字节的值设为值 c。
代码
#include<stdio.h> #include<string.h> #define MAXD 130 #define mod 1000000 int N,K; long long C[MAXD][MAXD]; void prepare(){ int i,j; memset(C,0,sizeof(C));//将数组中的所有值设为0 for(i=0;i<=100;i++) C[0][i]=1; for(i=1;i<=100;i++) for(j=1;j<=i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;//隔板法递推公式 } int main(){ prepare(); while(~scanf("%d%d",&N,&K),N||K){ printf("%lld\n",C[N+K-1][K-1]); } return 0; }
法二(dp):
公式:f[i][j]=sum(f[k]f[j-1])(0≤k≤i)
代码
#include<stdio.h> #define mod 1000000 #define MAXD 130 #define LL long long LL dp[MAXD][MAXD]; void DP() { int i,j,k; for(i=0;i<=100;i++) dp[i][0]=1; for(i=1;i<=100;i++) { for(j=1;j<=100;j++) { for(k=0;k<=i;k++) dp[i][j]=(dp[i][j]+dp[k][j-1])%mod; } } } int main() { int n,k; DP(); while(scanf("%d%d",&n,&k)!=EOF,n||k) { printf("%lld\n",dp [k]); } return 0; }
相关文章推荐
- CentOS7搭建SVN服务器
- Qt: 容器类和迭代器类、foreach关键字
- 司马迁与《史记》
- 迷宫问题
- 学了很久的android,你可能还是没有理解清楚的Context
- RXJava详解
- 稳定婚姻问题
- hdu 2068 RPG的错排(组合)
- 名人名言录(句子)
- 《礼记》的礼
- javascript面向对象学习笔记(四)——常用方法/属性
- eclipse的run as里面没有run on server
- CodeForces Gym 100971J 感觉题意有问题 BFS
- hdu 3723 Delta Wave
- Material Design系列,Behavior之BottomSheetBehavior与BottomSheetDialog
- 运行时简单使用-->获取对象的属性(class_copyIvarList)
- 深度学习试验之 多层感知器
- 威佐夫博弈(2堆)应用-- HDU 1527 取石子游戏
- hdu 2512 一卡通大冒险
- 走遍中国 —— 中国三大半岛