/*
总和为n分的硬币而言,具有k种的找零的硬币(d1,d2,,...,dk),希望找到一种算法可以在O(kn)时间内找到
具体思路:使用dp的思想,我们假设是对于总和是j分的硬币,对应的数量是c[j],那么的话,当j是小于等于0的时候的话就是c[j]=0;
j是非0的时候,相应的可以使用一种动态规划的思想,获取得到一种最优子结构,第一次找到di类钱找零,下一次进行的话就是最小的c[j]
所以对应的式子就是c[j]=1+min(c[j-di])(1<=i<=n)
*/
#include <iostream>
using namespace std;
#define N 10
struct Num
{
int num;//一共需要找零的钱总和
int k;//多少种零钱
int d[N+1];
int c[N+1];
int daemo[N+1];
Num(int n,int key):num(n),k(key)
{
for (int i=0;i<=num;++i)
{
d[i]=0;
c[i]=0xfffffff;
daemo[i]=0;
}
c[0]=0;
}
void init();
void change();
void print(int);
};
void Num::init()
{
for (int i=1;i<=k;++i)
{
cin>>d[i];
}
}
void Num::change()
{
for (int j=1;j<=num;++j)
{
for (int i=1;i<=k;++i)
{
if (j>=d[i]&&c[j]>1+c[j-d[i]])
{
c[j]=1+c[j-d[i]];
daemo[j]=d[i];
}
}
}
}
void Num::print(int j)
{
if(j>0)
{
cout<<daemo[j]<<" ";
print(j-daemo[j]);
}
}
int main()
{
Num nm(10,3);
nm.init();
nm.change();
nm.print(nm.num);
return 0;
}
找硬币(dp)
最新推荐文章于 2023-01-02 21:02:24 发布