题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=3181
题目大意:给定一个数p,要求用K种币值分别为1,2,3...K的硬币组成p,问方案数,1,2,2和2,2,1算一种方案即与顺序无关,n <= 1000,k <= 100。
解题思路:这不是很朴素的完全背包吗?只是价值是1.k,反而更简单。自己写了几组测试数据感觉没什么问题就交,没想到返回一个Wa。再想下,脑残啊,n = 1000,k = 100的时候就挂掉,然后用高精度模拟了加法,就顺利过掉了。
测试数据:
5 1
代码:
#include <stdio.h> #include <string.h> #define MAX 1100 int n,m; int dp[MAX][MAX]; void Add(int n,int m) { int i,j,k; for (i = 0; i <= 35; ++i) { dp[n][i] += dp[m][i]; if (dp[n][i] >= 10) dp[n][i] %= 10,dp[n][i+1]++; } } int main() { int i,j,k; while (scanf("%d%d",&n,&m) != EOF) { 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 = 35; i >= 0 && !dp[n][i]; --i); for (; i >= 0; --i) printf("%d",dp[n][i]); printf("\n"); } }
本文ZeroClock原创,但可以转载,因为我们是兄弟。