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)

UVA - 674 Coin Change Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: ...

UVA674Coin Change母函数模板题目

Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cent. We want to make c...

uva 674 - Coin Change(动态规划)

题目 算法: 用f(i,s)表示使用前i种硬币来凑s分钱的方法数。考虑第i种硬币的使用情况,它当然可以不用,也可以用1张,2张……直到再用一张就超过s分钱为止。 f(i,s)=f(i-1,s-k...

UVA 674 Coin Change(完全背包)

UVA 674 Coin Change(完全背包) http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page...

UVA OJ 674 - Coin Change 解题报告

原题题目如下: Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cent. We wan...

UVA 674 Coin Change【补充分析】

题目大意:凑钱,求组合方式 解题策略:今天算法课看到rank上此题AC的人最多,但是大多数人感觉没讲明白,在此分享下自己的一点点思考:              &#...

uva 674 && hdu 2069 coin change(动态规划、母函数)

题目地址:点击打开链接 dp[i][j]表示前i种硬币组成j元的方案数。 状态转移方程:dp[i][j] = ∑(dp[i-1][j-k*v[i]]). 递推递归都可以写。 也可以用母函数写,注意...

uvaoj 674 - Coin Change

uvaoj 674 - Coin Change 一个henjianda

Change HDU - 2069 / UVA - 674 DP入门

HDU 2069 Change 题目大意:给定5种面值的硬币50、25、10、5、1,然后输入一个钱的总数n,看看在所有使用的硬币数目不超过100的时候,n共有多少种组成结果m。然后输出这个m。 ...

coin_change_problem

  • 2008-09-07 23:29
  • 82KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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