class Solution {
public:
int dp[5005];
int change(int amount, vector<int>& coins) {
//dp[j]表示金额为j时的组合数
dp[0]=1;
for(int i=0;i<coins.size();i++)
{
for(int j=coins[i];j<=amount;j++){
dp[j]+=dp[j-coins[i]];
}
}
return dp[amount];
}
};
题解:如果求排列数的话,首先遍历背包,然后再遍历物品
class Solution {
public:
int dp[5005];
int change(int amount, vector<int>& coins) {
//dp[j]表示金额为j时的组合数
dp[0]=1;
for(int i=0;i<coins.size();i++)
{
for(int j=coins[i];j<=amount;j++){
if(j>=coins[i])
dp[j]+=dp[j-coins[i]];
}
}
return dp[amount];
}
};
class Solution {
public:
int dp[10005];
int coinChange(vector<int>& coins, int amount) {
//dp[i]表示组成金额i需要的最小硬币数
int max_val=0x3f3f3f3f;
memset(dp,max_val,sizeof(dp));
dp[0]=0;
for(int i=0;i<coins.size();i++){
for(int j=coins[i];j<=amount;j++)
{
dp[j]=min(dp[j],dp[j-coins[i]]+1);
}
}
if(dp[amount]!=max_val)
{
return dp[amount];
}
return -1;
}
};
class Solution {
public:
int dp[10005];
int numSquares(int n) {
//dp[i]表示和为i的最小完全平方数
int max_bal=0x3f3f3f3f;
memset(dp,max_bal,sizeof(dp));
dp[0]=0;
int w=sqrt(n);
if(w*w==n)
{
return 1;
}
else{
for(int i=1;i<=w;i++)
{
for(int j=i*i;j<=n;j++)
{
dp[j]=min(dp[j],dp[j-i*i]+1);
}
}
return dp[n];
}
}
};
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
//dp[j]表示前j个字符是否出现
int l=s.length();
vector<bool>dp(l+1,false);
set<string>se;
for(int i=0;i<wordDict.size();i++)
{
se.insert(wordDict[i]);
}
dp[0]=true;
for(int i=1;i<=s.length();i++)
{
for(int j=0;j<i;j++)
{
if(dp[j] && se.count(s.substr(j,i-j)))
{
dp[i]=true;
break;
}
}
}
return dp[l];
}
};