动态规划

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

  

posted @ 2020-08-22 00:09  肉松松松松  阅读(102)  评论(0)    收藏  举报