1. 程式人生 > >最少硬幣問題(動態規劃解決)

最少硬幣問題(動態規劃解決)

設有n中不同面值的硬幣,各硬幣的面值存在於陣列T[1..n]中,可以使用的面值硬幣個數不限。假如現在找的錢是j,1<<j<<L,求使得的硬幣數目最少

解決方法:

另c[i,j]代表用前中硬幣兌換j所用的最少數目。
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<cassert>
#define maxvalue 65535
using namespace std;
void making_change(int *T,int **c,int n,int L)
{
	
	for(int i=1;i<=n;i++)
		c[i][0]=0;
	for(int j=1;j<+L;j++)
	{
		if(j%T[1]==0)
			c[1][j]=j/T[1];
	}
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=L;j++)
		{
			int m=j/T[i];
			for(int k=0;k<=m;k++)
			{
				if((k+c[i-1][j-k*T[i]])<c[i][j])//遞迴的式子
					c[i][j]=k+c[i-1][j-k*T[i]];
			}
		}
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	ifstream in("1.txt");
	assert(in);
	int n;
	int L;
	in>>n;
	in>>L;
	int m;
	int *T=new int[n+1];
	T[0]=0;
	for(int i=1;i<=n;i++)
	{
		in>>m;
		T[i]=m;
	}
	int **c=new int*[n+1];
	for(int i=0;i<n+1;i++)
	    c[i]=new int[L+1];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=L;j++)
			c[i][j]=maxvalue;
	making_change(T,c,n,L);
	for(int j=1;j<=L;j++)
	{
		cout<<"面值為"<<j<<"的最小硬幣數目:"<<c[n][j]<<endl;
	}
	
	return 0;
}


相關推薦

最少硬幣問題動態規劃解決

設有n中不同面值的硬幣,各硬幣的面值存在於陣列T[1..n]中,可以使用的面值硬幣個數不限。假如現在找的錢是j,1<<j<<L,求使得的硬幣數目最少 解決方法: 另c[i,j]代表用前中硬幣兌換j所用的最少數目。#include "stdafx.h"

硬幣找零問題動態規劃求解

如果我們有面值為1元、3元和5元的硬幣若干枚,如何用最少的硬幣湊夠11元? (表面上這道題可以用貪心演算法,但貪心演算法無法保證可以求出解,比如1元換成2元的時候) 首先我們思考一個問題,如何用最少的硬幣湊夠i元(i<11)?為什麼要這麼問呢? 兩個原因:1.當

投擲硬幣動態規劃

#1506 : 投擲硬幣 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 小Hi有一枚神奇的硬幣。已知第i次投擲這枚硬幣時,正面向上的概率是P

數組中最長的升序子序列動態規劃問題

ace dia mic enc namespace 進行 strong main log The longest Increasing Subsequence (LIS) 給定一個序列,找到這個序列的一個最長的子序列,使得子序列的所有元素是升序的,且元素之間的相對位置不變

BZOJ4828 AHOI/HNOI2017大佬動態規劃+bfs

math sub pre per 級別 include name map esp   註意到懟大佬的操作至多只能進行兩次。我們逐步簡化問題。   首先令f[i][j]表示第i天結束後自信值為j時至多有多少天可以進行非防禦操作(即恢復自信值之外的操作)。這個dp非常顯然。由於

UVA11584-Partitioning by Palindromes動態規劃基礎

tput form enc rom 結束 tdi ron str 出現 Problem UVA11584-Partitioning by Palindromes Accept: 1326 Submit: 7151Time Limit: 3000 mSec Proble

UVA1626-Brackets sequence動態規劃基礎

Problem UVA1626-Brackets sequence Time Limit: 4500 mSec Problem Description       Input The input begins with a

股市的交易日動態規劃演算法

股市的交易日 /// /// 在股市的交易日中,假設最多可進行兩次買賣(即買和賣的次數均小於等於2),規則是必須一筆成交後進行另一筆(即買-賣-買-賣的順序進行)。給出一天中的股票變化序列,請寫一個程式計算一天可以獲得的最大收益。 ///給定價格序列prices及它的長度n

最長公共子序列動態規劃DP

#include<iostream> #include<cstdio> using namespace std; char x[101]; //字元陣列x儲存字串x c

01揹包問題動態規劃求解

這兩天c++的習題開始不考察c++了,開始考察動態規劃問題,唉,沒學過動態規劃演算法來編這題目真是一把辛酸淚,下面給出題目(題目來源:郭瑋老師的mooc) 2:Charm Bracelet 檢視 提交 統計 提問 總時間限制: 1000ms 記憶體限制: 655

POJ 3181 Dollar Dayz動態規劃+大數

題目傳送門 Description Farmer John goes to Dollar Days at The Cow Store and discovers an unlimited number of tools on sale. During his first

c++實現0-1揹包問題完整原始碼動態規劃實現

轉自:東風破的部落格 http://blog.sina.com.cn/jaydongfengpo #include  #define MAX_NUM 5 #define MAX_WEIGHT 10 usingnamespace std;   //動態規劃求解 int 

LeetCode -- Triangle 路徑求最小和 動態規劃問題

Given a triangle, find the minimum path sum from top to bottom.  Each step you may move to adjacent numbers on the row below. For example, given the foll

HDU 2084 數塔問題動態規劃入門

Description 在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的:  有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?  已經告訴你了,這是個DP的題目,你能AC嗎? Input 輸入資

POJ 1088 滑雪動態規劃經典

滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 63875 Accepted: 23387 Description Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度

編輯距離動態規劃經典

1183 編輯距離 編輯距離,又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替換成另一個字元

Leetcode 120. Triangle 三角形問題動態規劃經典 解題報告

1 解題報告 首先我承認我很二哈,這道題我明明已經做過了,但是剛剛不知道為什麼又去做了一遍,而且我查了下兩次的解法還有所差別(貌似是現在的版本有進步了呢) 問題就是一個三角形的陣列,求從頂部到下方的最短路徑。。 這個問題是太過經典+Easy的DP問題了,哈

lintcode115不同路徑問題動態規劃easy

public class Solution { /** * @param obstacleGrid: A list of lists of integers * @return: An integer */ publ

滑雪動態規劃+dfs

描述 Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道載一個區域中最長的滑坡。區域由一個

#195 game動態規劃+二分

else fine 計算 from vector ret brush while std   考慮第一問的部分分。顯然設f[i]為i子樹從根開始擴展的所需步數,考慮根節點的擴展順序,顯然應該按兒子子樹所需步數從大到小進行擴展,將其排序即可。   要做到n=3e5,考慮換根d