[C++]面试题之动态规划类问题

2019-10-19  本文已影响0人  循环不计次
    int target=13;
    int last_coin=2;
    for(int k=0;k<=target/last_coin;++k)
    {
        dp[last_coin][target]+=dp[last_coin-1][target-k*last_coin];
    }

看完代码就有人会问,那d[1][target-k*last_coin]的值从哪里来?那当然是根据d[0][target-k * last_coin]的值累积来的,那么d[0][target-k * last_coin]的值又从哪里来?朋友们,0的时候是在求问题“用0种硬币求目标数值可能性有多少种”的答案了,答案当然是1,你要用0种硬币求一个数值,那么所有的组合只有一种,数值是0,各种硬币的数量也为0.

#include<iostream>
using namespace std;
int main(){
    int coins[4]={1,2,5,10};//硬币种类数组
    const int coin_kinds_num=sizeof(coins)/sizeof(coins[0]);
    const int total=13;//要组合成的目标数值
    /*以上为条件:硬币种类和要组合成的目标数值*/
    int dp[coin_kinds_num][total+1];
    for(int i=0;i<coin_kinds_num;i++)
    {
        dp[i][0]=1;
    }
    /*以上为初始化特殊情况(后面计算要用)当要组合成的目标数值为0的时候,只有一种情况,那就是各种硬币的搭配都是0个*/
    for(int i=1;i<=coin_kinds_num;++i)//这里i从1开始,因为已经跳过了特殊情况,而且也不会组合目标数值0
    {
        for(int j=1;j<=total;++j)//
        {
            dp[i][j]=0;//数组未初始化的时候值是随机数,这里初始化一下
            for(int k=0;k<=j/coins[i-1];++k)//这里的j/coins[i-1]是指用i种硬币去组合目标时,最多可以放多少个coins[i-1]这种硬币
            {
                dp[i][j]+=dp[i-1][j-k*coins[i-1]];
            }
        }
    }
    return 0;
}

上一篇下一篇

猜你喜欢

热点阅读