oyjpArt ACM/ICPC算法程序设计空间

// I am new in programming, welcome to my blog
I am oyjpart(alpc12, 四城)
posts - 224, comments - 694, trackbacks - 0, articles - 6

DP--3个硬币问题的思考

Posted on 2006-08-07 00:56 oyjpart 阅读(1031) 评论(2)  编辑 收藏 引用


§硬币问题1:
有n种硬币,每种硬币的面值为vi元,且只有一枚,问用这n种硬币找零S元的方法数。
§设d[i][j]为前i种硬币组成j元的方法数。
d[i][j] = d[i-1][j] + d[i-1][j-vi]
d[0][0]=1,d[0][1…S]=0
§空间复杂度为O(n2),浪费! 
d[0]=1; d[1…S]=0;
for (i=1; i<=n; i++)
{
for (j=S; j>=vi; j--)
{
      d[j] += d[j-vi];

     }
}


§硬币问题2:
有n种硬币,每种硬币的面值为vi元,有mi枚,问用这n种硬币找零S元的方法数。
 
d[0]=1;d[1…S]=0;
for (i=1; i<=n; i++)
{
for (j=S; j>=vi; j--) //对上一阶段
{
for(k=1;k<=mi;k++)
{
      if (j-k*vi>=0) d[j] += d[j-k*vi];
}
}
}
 
§硬币问题3:
有n种硬币,每种硬币的面值为vi元,有无数枚,问用这n种硬币找零S元的方法数。
 
d[0]=1;d[1…S]=0;
for (i=1; i<=n; i++)
{
for (j=S; j>=vi; j--)
{
for(k=1;;k++)
{
      if (j-k*vi>=0) d[j] += d[j-k*vi];
else break;
}

}
也可以这样写
 
d[0]=1; d[1…S]=0;
for (i=1; i<=n; i++)
{
for (j=vi;j<=S; j++)
{
      d[j] += d[j-vi];
  }
}

从中我们可以看出DP其实就是对重叠子问题的记忆化求解

Feedback

# 希望和热衷于算法设计的朋友们手拉手  回复  更多评论   

2006-08-08 02:30 by 我爱ACM
我也热衷于算法设计,希望我的博客能和你的博客手拉手。我的博客是http://www.cnitblog.com/cockerel

# re: DP--3个硬币问题的思考  回复  更多评论   

2006-08-08 11:51 by sicheng
@我爱ACM
谢谢不嫌弃在下才疏学浅 能与您交流是我的荣幸

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理