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