一、找零问题
引入递归
此题有三种解法
第一种:这种方法使用了递归耗时时间较长
#include<iostream>
using namespace std;
int mec(int change)
{
if(change==0)
return 0;
if(change<0)
return -1;
int count = 1000;
if(change>=5)
{
count = min(count,mec(change-5)+1);
return count;
}
if(change>=2)
{
count = min(count,mec(change-2)+1);
}
if(change>=1)
{
count = min(count,mec(change-1)+1);
}
return count;
}
int main()
{
cout<<mec(11);
}
第二种:这种方法在递归的基础上加以存储算是递归的改进
#include<iostream>
using namespace std;
int memo[100] = {0};
int mec(int change, int *memo)
{
if(change==0)
return 0;
if(change<0)
return -1;
if(memo[change]!=0)
return memo[change];
int count = 1000;
if(change>=5)
{
count = min(count,mec(change-5, memo)+1);
memo[change] = count;
}
if(change>=2)
{
count = min(count,mec(change-2, memo)+1);
memo[change] = count;
}
if(change>=1)
{
count = min(count,mec(change-1, memo)+1);
memo[change] = count;
}
return memo[change];
}
int main()
{
cout<<mec(11,memo);
}
第三种:这种方法使用了动态规划的算法,效率高
#include<iostream>
using namespace std;
const int coins[3] = {5,1,2};
int dp[12]={0};
int main()
{
for(int i=1; i<12; i++)
{
dp[i] = 1000000;
}
for(int i=1; i<12; i++)
{
for(int j=0; j<3; j++)
{
if(i>=coins[j] && dp[i-coins[j]]+1<dp[i])
dp[i] = dp[i-coins[j]]+1;
}
}
cout<<dp[11];
}