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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值