首页 > 其他分享 >UVA - 674 Coin Change 经典问题

UVA - 674 Coin Change 经典问题

时间:2023-04-07 11:09:50浏览次数:44  
标签:25 coin 硬币 674 int 7500 UVA Coin dp


题目大意:给出5中硬币,分别是1,5,10,25,50,然后给你一个数字,能由这五种硬币组成的方式有多少种

解题思路:解法一:硬币按小到大排,用j表示还有能用几种硬币表示,则当j==0时,则表示所剩下的值可以用n个1来表示,具体看代码

#include<cstdio>
const int maxn = 7500;
int coin[5] = {1,5,10,25,50};
int s[maxn][5],n;

int dp(int i, int j) {

	if(j == 0)
		return s[i][j] = 1;

	if(s[i][j] > 0)	
		return s[i][j];

	for(int k = 0; k <= i; k += coin[j]) 
		s[i][j] = s[i][j] + dp(i-k,j-1);
	
	return s[i][j];	
}

int main() {
	while(scanf("%d", &n) != EOF)  {
		printf("%d\n", dp(n,4));
	}
	return 0;	
}



解法二:滚动数组的打表法,用dp[i]表示i能有几种表示方式,则dp[i] = dp[i] + dp[i-coin[j]],第二个dp[i]表示的是再第j种硬币之前的i能有几种表示方式

#include<cstdio>
#include<cstring>

int dp[7500] = {0};
int coin[5] = {50,25,10,5,1};

int main() {
	dp[0] = 1;
	for(int i = 0 ; i < 5; i++)
		for(int j = coin[i]; j < 7500; j++)
			dp[j] += dp[j-coin[i]];
	int num;
	while(scanf("%d",&num) != EOF)
		printf("%d\n",dp[num]);
}




标签:25,coin,硬币,674,int,7500,UVA,Coin,dp
From: https://blog.51cto.com/u_10970600/6175558

相关文章

  • UVA - 757 Gone Fishing 贪心+枚举
    题目大意:有n个湖泊,每个湖泊最初的5分钟能钓到f条鱼,每五分钟减少d条鱼,鱼的数目不能小于d也不能为负数,求在h小时能钓到的鱼的最大数目和在每个池塘带了多少分钟解题思路:一个个枚举,如果用总时间减去到达另一个湖泊的时间的话,就表示它可以在两个湖泊随意行走了,然后在这些时间找到优解,并......
  • UVA - 10716 Evil Straw Warts Live 贪心
    题目大意:给出一串字符串,问这串字符串是不是回文字符串,如果是的话需要移动几步解题思路:判断是不是回文,只需要判断里面的字母的个数,如果奇数字符出现超过了1个,那个这个就不是回文字符串了。接下来是移动,应该由外向里移动,不管是先移动那个字符,最后移动的步数都是一样的,所以从前往后扫......
  • UVA - 116 Unidirectional TSP 多段图的最短路
    题目大意:给出一个矩阵,要求每列都要路过,起点必须是第一列,求经过的最短路径的上面的数字和最小解题思路:公式为d[i][j]=min(d[i][j+1],d[i+1][j+1],d[i-1][j+1])+a[i][j],本题要注意,因为可以从最上面一行到最后一行,或者从最后一行到第一行,注意i的变化#include<cstdio>#include<alg......
  • UVA - 10148 Advertisement 区间取点问题
    题目大意:在一个公园里,有N个跑步者,每个跑步者都有固定的跑步范围,有个广告商要在公园里放置广告牌,要求每个广告牌至少要被每个跑步者看到K次,如果跑步者的区间不够K的要,那么在他的区间内每个点都要有广告牌解题思路:区间选点问题,先按右端从小到大排序,然后统计该区间内已经有几个广告牌......
  • UVA - 108 Maximum Sum 求子矩阵的最大和
    题目大意:给出一个矩阵,求出这个矩阵中的子矩阵的最大和解题思路:和UVA507的题目类似,只不过这次是个矩阵了,换个角度思考,将这个二维数组转换成一维数组思考,用sum存储该列的前N个数字的和,如,sum[3][1]就是第一列的前三个数字的和,这样就可以将其想象成一维的最大连续和了,在枚举行,求其最大的和......
  • UVA - 10245 The Closest Pair Problem 分治法
    题目大意:给出一系列的点,求出距离最近的两点的距离的大小,如果该距离大于10000,则输出INFINITY,如果不是的话,输出保留四个小数点的距离解题思路:如果裸的枚举的话,无疑是TLE,O(n^2)的算法既然不行的话,就换分治法试试,将其按X轴坐标的大小排序,由小到大,分别求出每部分的大小,然后进行比较,比较难......
  • UVA - 10905 Children's Game 字符串的排序
    题目大意:给出N个数字串,要求拼出有数字最大的串解题思路:用string就很好解决#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>usingnamespacestd;constintmaxn=60;stringstr[maxn];intcmp(stringa,stringb){ returna+b>b+a;}......
  • UVA - 10706 Number Sequence 子序列
    #include<cstdio>#include<cmath>#include<algorithm>usingnamespacestd;constintmaxn=32761;longlongS[maxn];//存放的是S1,S2,到SK的和,S[5]表示了S1到S4的和,当数字变化到K的时候,一共有多少个字数了intborder[9]={0,1,10,100,1000,10000,100000,1000000,10000000......
  • UVA - 129 Krypton Factor 回溯+剪枝
    题目大意:给出N种字母,要求用这N种字母组成一个困难的串,困难的串指在串中没有相连的两个子串相同,要求输出第M个困难的串解题思路:像八皇后一样,前面判断的就不需要再去判断了,直接往后判断即可#include<cstdio>#include<cstring>intn,L;intans[100];boolflag;intcnt;boolju......
  • Cyborg Genes UVA - 10723
    求一个最短序列,使得输入的两个串的均为他的子序列,同时输出方案数。  n+m-LCS方案数转移时求#include<iostream>#include<cstring>usingnamespacestd;#defineintlonglongintn,m;chara[102],b[102];intf[102][102],cnt[102][102];signedma......