Poj 3181 Dollar Dayz (DP_背包)

题目链接: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

5 3

410 100

1000 100


代码:

#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原创,但可以转载,因为我们是兄弟。

你可能感兴趣的:(测试)