问题:
You are given coins of different denominations and a total amount of money. Write a function to compute the number of combinations that make up that amount. You may assume that you have infinite number of each kind of coin.
Note: You can assume that
- 0 <= amount <= 5000
- 1 <= coin <= 5000
- the number of coins is less than 500
- the answer is guaranteed to fit into signed 32-bit integer
我的代码:
class Solution {
public:
int change(int amount, vector<int>& coins) {
int count = 0;
if(amount==0) return 1;
else if(coins.empty()) return 0;
for(int i=0; i<coins.size();i++)
{
if(amount==coins.at(i))
{
count++;
}
else if(amount>coins.at(i))
{
vector<int> temp(coins);
vector<int>::iterator it;
for(it=temp.begin();it!=temp.end();)
{
if(*it>coins.at(i))
{
it = temp.erase(it);
}
else{
it++;
}
}
count+=change(amount-coins.at(i),temp);
}
}
return count;
}
};
结果:
Submission Result: Time Limit Exceeded
时间复杂度太高了,改用dynamic programming:
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector <vector<int> > dp(coins.size()+1, vector<int>(amount+1));
dp.at(0).at(0)=1;
for(int i=1;i<=coins.size();i++)
{
dp.at(i).at(0)=1;
for(int j=1;j<=amount;j++)
{
dp.at(i).at(j) = dp.at(i-1).at(j) + ((j-coins.at(i-1))>=0? dp.at(i).at(j-coins.at(i-1)):0);
}
}
return dp.at(coins.size()).at(amount);
}
};