动态规划之——完全背包问题
Posted ych9527
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划之——完全背包问题相关的知识,希望对你有一定的参考价值。
1.什么是完全背包问题
2.实战例题——零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
题目链接
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<vector<int>> dp(coins.size()+1,vector<int>(amount+1,0));
//dp[0][n]=0;金币为0,组成n的方案0种
if(amount==0)//为0时,需要0个硬币
return 0;
for(int i=0;i<coins.size();i++)
{
for(int j=0;j<=amount;j++)
{
if(j-coins[i]==0)//直接一个金币就组成了
dp[i+1][j]=1;
else if(j-coins[i]>0)//当前金币可选可不选
{
if(dp[i+1][j-coins[i]]!=0&&dp[i][j]!=0)//可以从前面过来
dp[i+1][j]=fmin(dp[i+1][j-coins[i]]+1,dp[i][j]);//选取小的
else if(dp[i+1][j-coins[i]]!=0)
dp[i+1][j]=dp[i+1][j-coins[i]]+1;
else if(dp[i][j]!=0)
dp[i+1][j]=dp[i][j];
}
else//不能选
dp[i+1][j]=dp[i][j];
}
}
if(dp[coins.size()][amount]==0)
return -1;
return dp[coins.size()][amount];
}
};
空间优化:
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount+1,0);
if(amount==0)//为0时,需要0个硬币
return 0;
for(int i=0;i<coins.size();i++)
{
for(int j=0;j<=amount;j++)
{
if(j-coins[i]==0)
dp[j]=1;
else if(j-coins[i]>0)
{
if(dp[j-coins[i]]!=0&&dp[j]!=0)
dp[j]=fmin(dp[j-coins[i]]+1,dp[j]);
else if(dp[j-coins[i]]!=0)
dp[j]=dp[j-coins[i]]+1;
}
}
}
if(dp[amount]==0)
return -1;
return dp[amount];
}
};
3. 实战例题—零钱兑换 II
给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。
题目链接
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<vector<int>> dp(coins.size()+1,vector<int>(amount+1,0));
dp[0][0]=1;
for(int i=0;i<coins.size();i++)
{
for(int j=0;j<=amount;j++)
{
if(j==0)
dp[i+1][j]=1;//不管多少硬币,组成0的方式都是1->不选
else if(j-coins[i]>=0)//表示可以选
dp[i+1][j]=dp[i+1][j-coins[i]]+dp[i][j];
else
dp[i+1][j]=dp[i][j];
}
}
return dp[coins.size()][amount];
}
};
空间优化:
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount+1,0);
dp[0]=1;//组成金额为0的总数为1种
for(int i=0;i<coins.size();i++)
{
for(int j=0;j<=amount;j++)
{
if(j-coins[i]>=0)//表示可以选
dp[j]=dp[j-coins[i]]+dp[j];
}
}
return dp[amount];
}
};
以上是关于动态规划之——完全背包问题的主要内容,如果未能解决你的问题,请参考以下文章