uva:674 - Coin Change

原创 2012年03月30日 12:57:14

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=615

题目大意:有五个数,分别为:1 , 5 , 10 , 25  , 50 ,对于任意输入的一个正整数n , n由其中的一个或者多个数组合累加得到,求有多少种方法。例如:11可以由11个1组成,也可以由6个1一个5组成,还可以有一个10 ,一个1组成,或者2个5和一个1,一共有4种方法.

开始的时候想用一个一维数组来表示,对应的数n的可能组成方式个数,状态转移的时候发现有大量的重复,这样求出的结果中有很多的重复。开一个二维数组来表示,横向表示,用前j个数,可能的组成方式个数,这样状态转移的时候就不会出现重复了。

 设num[i][j] 表示整数i有前j个数的组成的所有可能情况。

num[i][j] = num[ i - data [ j ] ] [ j ]  ( i / data [ j ] > 0 )  &&  num [ i ] [ j ] += num[ i ] [ j - 1 ]  ( j  >  0 ) 

源代码:

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;
const int maxn = 7500 ;

int num[maxn][6];
int data[] ={1 , 5 , 10 , 25 , 50} ;

int n ;

int main()
{
//	freopen("in.txt" , "r" , stdin);
	int i ;
	int j ;

	memset(num , 0 , sizeof(num));
	num[0][0] = 1 ;

	for(i = 0 ; i <= 7500 ; i ++)
	{
		for(j = 0 ; j < 5 ; j ++)
		{
			if(i/data[j])
			{
				num[i][j] = num[i-data[j]][j]  ;
			}
			if(j > 0)
				num[i][j] += num[i][j-1] ;
		}
	}

	while(cin>>n)
	{
		printf("%d\n" , num[n][4]) ;
	}
    return 0;
}

补充 ,在用递推的方式AC后, 又用记忆化搜索的方式试了下,代码如下:

#include<iostream>
#include<string.h>
#include<stdio.h>

using namespace std ;

const int maxn = 7500 ;
int  data[] = { 1 , 5 , 10 , 25 , 50} ;

int num[maxn][5] ;
int dp(int  , int ) ;

int n ;

int main()
{
	//freopen("in.txt" , "r" , stdin) ;
	memset(num , 0 , sizeof(num)) ;
	while(cin>>n)
	{
		cout<<dp(4 , n)<<endl ;
	}
	return 0 ;
}

int dp(int layer , int s)
{
	if( s == 0)
		return 1 ;
	int & ans = num[s][layer] ;

	if(ans > 0)
		return ans ;

	if(s >= data[layer])
		ans += dp(layer , s - data[layer]) ;
	if(layer > 0)
		ans += dp(layer - 1 , s ) ;
	return ans ;
}



uva 674 Coin Change(类似完全背包)

有点类似完全背包,不过最后的容量必须被充满。 dp[i][j]表示在前i个物品中选择容量不超过j的最大价值。 完全背包转移方程:dp[i][j] = max(dp[i-1][j] , dp[i][j...
  • sinat_22659021
  • sinat_22659021
  • 2015年08月11日 23:17
  • 407

UVA 674 - Coin Change 完全背包求状态数

传送门:UVA674 题意:用1、5、10、25、50 这五个数去凑给定的数n,问有多少种方案。 个认为这题真的挺好的,如果你理解透彻了,20行就能写出来,但要是抓不到本质就无从下手。 网上关于...
  • lxy767087094
  • lxy767087094
  • 2017年01月16日 00:28
  • 67

UVA 674 Coin Change 钱币兑换问题 类似完全背包

题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_prob...
  • yskyskyer123
  • yskyskyer123
  • 2015年12月02日 16:42
  • 223

【母函数】hdu2069(Coin Change)母函数加深

hdu2069 思路:组合问题,可以考虑用母函数,但是这里考虑组合的个数和组合的最大数。硬币的个数不超过100;而且硬币的 总值不大于250。要同时兼顾这些问题,同一总值,可以由不同个数的硬币组成,即...
  • u011479875
  • u011479875
  • 2015年04月09日 15:51
  • 583

HDU 2069 & UVA 674 Coin Change(换硬币 dp 入门经典水题,背包问题)

Coin Change Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u ...
  • xia842655187
  • xia842655187
  • 2016年05月06日 20:35
  • 435

UVA 674 —— 简单DP

674 - Coin Change Time limit: 3.000 seconds   Coin Change  Suppose there are ...
  • zkzxmzk
  • zkzxmzk
  • 2013年11月04日 17:39
  • 349

322. Coin Change(硬币找零)

322. Coin Change(硬币找零)Coin Change硬币找零 题目链接 题目描述 题目分析 方法动态规划 算法描述 参考代码 题目链接https://leetcode.com/probl...
  • qq_32142535
  • qq_32142535
  • 2017年12月18日 23:46
  • 36

UVA 674 背包之殇

题目地址 : http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19104     本来以为对于简单的背包已经了解了,可还是在这...
  • z3635363
  • z3635363
  • 2013年10月11日 02:42
  • 298

Coin Change(hdu2069,暴力or母函数)

http://acm.hdu.edu.cn/showproblem.php?pid=2069 Coin Change Time Limit: 1000/1000 MS (Java/Others...
  • JHC23
  • JHC23
  • 2013年08月18日 09:59
  • 1066

动态规划之硬币兑换(Coin Change)

原文地址:Dynamic Programming | Set 7 (Coin Change)已知N,如果我们想要换N分,而且每种S = { S1, S2, .. , Sm} 价值的硬币是不限数量的,那...
  • sinat_36246371
  • sinat_36246371
  • 2016年10月17日 10:22
  • 166
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:uva:674 - Coin Change
举报原因:
原因补充:

(最多只允许输入30个字)