https://leetcode-cn.com/problems/coin-change/
class Solution {
public:
//index 是index及其后面的硬币随便选
int process1(vector<int>& coins, int index,int amount)
{
int res=-1;
//如果所有钱都已经用到了amount还有剩余的话就返回0
if(index==coins.size())
{
res= amount==0?0:-1;
}
else
{
for(int i=0;i*coins[index]<=amount;i++)
{
int nextAim=amount-i*coins[index];
int temp=process1(coins,index+1,amount-i*coins[index]);
if(temp!=-1)
{
if(res==-1)
{
res=temp+i;
}
else
{
res=min(res,temp+i);
}
}
}
}
return res;
}
int process2(vector<int>& coins,int amount)
{
int row=coins.size()+1;
int col=amount+1;
int dp[row][col];
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
{
dp[i][j]=amount+1;
}
dp[row-1][0]=0;
for(int i=row-2;i>=0;i--)
{
for(int j=0;j<=coins[i]-1;j++) dp[i][j]=dp[i+1][j];
for( int j=coins[i] ;j<col ;j++ )
{
//if( dp[i+1][j]!=-1 &&dp[i][j-coins[i]]!=-1 )
//{
dp[i][j]=min( dp[i+1][j],dp[i][j-coins[i]]+1 );
//}
// else if( dp[i][j-coins[i]]==-1 )
// {
// dp[i][j]=dp[i+1][j];
// }
// else
// dp[i][j]=dp[i][j-coins[i]]+1;
}
}
// for(int i=0;i<row;i++)
// {
// for(int j=0;j<col;j++)
// {
// cout<<setw(4)<<dp[i][j]<<" ";
// }
// cout<<endl;
// }
return dp[0][col-1]==amount+1?-1:dp[0][col-1];
}
int process3(vector<int>& coins,int amount)
{
int row=coins.size()+1;
int col=amount+1;
int dp[col];
sort( coins.begin(),coins.end() );
for(int j=0;j<col;j++)
{
dp[j]=amount+1;
}
dp[0]=0;
for(int j=1;j<col;j++)
{
for( int i=0 ;i<row-1 ;i++ )
{
if( j>=coins[i] )
dp[j]=min( dp[j],dp[ j-coins[i] ]+1 );
else
{
break;
}
}
}
// for(int j=0;j<col;j++)
// {
// cout<<dp[j]<<" ";
// }
// cout<<endl;
return dp[col-1]==amount+1?-1:dp[col-1];
}
int coinChange(vector<int>& coins, int amount) {
if( coins.size()==0 )
return -1;
if( amount==0 )
return 0;
// int res=process1(coins,0,amount);
int res=process3(coins,amount);
return res;
}
};