poj 3181
地址:http://poj.org/problem?id=3181
题意:类似分硬币,给n,m,钱是n,有m中硬币,分别是1~m,求多少种分法
mark:普通的完全背包不行,会超long long,需要一点高精度的技巧,会大数加法就没问题了。
代码:
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <iostream> #include <algorithm> #include <map> #define LL long long using namespace std; const int N = 1010; int dp[N][40]; void add(int n, int m) { int i,j,k; for(i = 0; i < 40; i++) { dp[n][i] += dp[m][i]; if(dp[n][i] >= 10) dp[n][i] -= 10, dp[n][i+1]++; } } int main() { int n,m; int i,j; while(~scanf("%d%d", &n, &m)) { memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for(i = 1; i <= m; i++) for(j = i; j <= n; j++) add(j, j-i); for(i = 40; i >= 0 && !dp[n][i]; i--); for(; i >= 0; i--) printf("%d", dp[n][i]); printf("\n"); } return 0; }