UVA-10943(dp)

来源:互联网 发布:最终幻想龙女捏脸数据 编辑:程序博客网 时间:2024/05/16 06:19

题意:

把k个不超过n的数加起来,使得他们的和为n,有多少种方法;

思路:

简单dp,dp[i][j]表示把i分成j个数的方案数,dp[i][j]=dp[0][j-1]+dp[1][j-1]+dp[2][j-1]+...+dp[i][j-1];(相当于第j个数为[0,i];)

AC代码:

//#include <bits/stdc++.h>#include <vector>#include <iostream>#include <queue>#include <cmath>#include <map>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;#define Riep(n) for(int i=1;i<=n;i++)#define Riop(n) for(int i=0;i<n;i++)#define Rjep(n) for(int j=1;j<=n;j++)#define Rjop(n) for(int j=0;j<n;j++)#define mst(ss,b) memset(ss,b,sizeof(ss));typedef  long long LL;template<class T> void read(T&num) {    char CH; bool F=false;    for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());    for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());    F && (num=-num);}int stk[70], tp;template<class T> inline void print(T p) {    if(!p) { puts("0"); return; }    while(p) stk[++ tp] = p%10, p/=10;    while(tp) putchar(stk[tp--] + '0');    putchar('\n');}const LL mod=1e6;const double PI=acos(-1.0);const LL inf=1e18;const int N=1203;const int maxn=1005;LL dp[105][105];void Init(){for(int i=0;i<=100;i++){dp[0][i]=1;}for(int i=1;i<=100;i++){for(int j=1;j<=100;j++){for(int x=0;x<=i;x++){dp[i][j]+=dp[x][j-1];dp[i][j]%=mod;}}}}int main(){int n,k;Init();while(1){cin>>n>>k;if(!n&&!k)break;printf("%lld\n",dp[n][k]);}        return 0;}



0 0
原创粉丝点击