现在的位置: 首页 > 综合 > 正文

hdu 1284 钱币兑换问题 (DP)

2014年02月23日 ⁄ 综合 ⁄ 共 773字 ⁄ 字号 评论关闭

点击打开链接

//dp(完全背包)
#include <stdio.h>
#include <string.h>
#define N 35000
int dp[N];
int main()
{
    dp[0] = 1;
    for(int i = 1; i <= 3; ++i)
    {   //背包容量为N,装入质量为i 的物品
        for(int j = i; j < N; ++j)
        {
            dp[j] += dp[j-i];
        }
    }
    int n;
    while(scanf("%d", &n) != EOF)
        printf("%d\n", dp[n]);
    return 0;
}
//hdu 1284 找规律 
//给出n 看能n 内有多少个 2 和多少个3 
//具体看代码和一下注视
#include<stdio.h> 
#include <string.h> 
#define N 35000
__int64 ans[N];
int main()
{ 
	int n; // 计算i 可以由多少个 2 组成 
	for(int i = 0; i < N; ++i)
		// 后面的 +1 表示全由1组成的(只有1中情况)
		ans[i] = i / 2 + 1; 
	//则这一行表示由 2组成的情况加上由1组成的情况 
	// 从前面往后推,看能由几个3 组成,比如 ans[3]表示钱为3时 
	// 由1,2分硬币组成的情况,可以表示成钱为0 时加上一个3分硬币(这时方法数为
	// 钱为 0 时由1,2,3组成的情况 加上钱为3时由1,2组成的方法数)
	// 因此 ans[i] += ans[i-3]+1;不需要后面的+1 
	for(int i = 3; i < N; ++i) ans[i] += ans[i-3];
	//这一行ans[i]就表示由2组成的情况加上由3组成的情况 
	// ans[6]就相当于由2组成的情况ans[6] 加上 由1,2,3组成的情况的ans[6-3] 
	// 这样往后推,就可以把 由3分组成的情况加上去 
	while(scanf("%d", &n) != EOF) 
		printf("%I64d\n", ans[n]);
	return 0; 
}



抱歉!评论已关闭.