硬币不限量版,这个不限量有点像背包问题。
#include <QCoreApplication>
#include <QDebug>
int minsum(int *coins , int sum)
{
if (sum == 0 )
return 0 ;
if (sum < 0)
return -1 ;
int ans = 1000 ;
for (int i =0 ; i < 3 ; i++)
{
int t = minsum(coins,sum-coins[i]) ;
if (t == -1)
continue ;
t = t+1 ;
ans = ans < t ?ans :t ;
}
return ans ;
}
int minsum(int *coins , int sum,QVector<int> &vec)
{
if (sum == 0 )
return 0 ;
if (sum < 0 )
{
return -1 ;
}
int ans = 10000 ;
if (vec[sum] != 1000)
return vec[sum] ;
for (int i = 0 ; i < 3 ; i++)
{
int t = minsum(coins,sum - coins[i],vec) +1 ;
if (t == 0)
continue ;
// qDebug()<< "ans : " << ans ;
ans = ans < t? ans :t ;
}
vec[sum] = ans ;
return vec[sum] ;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int coins[3] = {1,2,5} ;
int sum = 20 ;
QVector<int> vec(1+sum ,1000);
int tt = minsum(coins,sum) ;
qDebug()<< tt ;
int t = minsum(coins,sum,vec) ;
qDebug() << t ;
QVector<int> vec_t(sum +1 ,1000) ;
vec_t[0] = 0;
for (int i = 0 ; i < sum+1 ; i++)
{
for (int j = 0 ; j <3 ; j++ )
{
if (i >= coins[j])
{
t = vec_t[i-coins[j]] + 1 ;
vec_t[i] = vec_t[i] < t ? vec_t[i]:t ;
}
}
}
qDebug() <<"dp :" <<vec_t[sum] ;
return a.exec();
}
4
4
dp : 4