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

設有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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章