题目:有n种硬币,面值分别为V1,V2,...Vn,每种都有无限多。给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值!
分析:我们把每种面值看作一个点!表示“还需要凑足的面值”,初始状态为S,目标状态为0。那么若当前状态在i,每使用一个硬币j,状态便转移到i-Vj。
int dp(int s) //d[0]设为0,最多硬币数目
{
if(vis[s])
return d[s];
vis[s]=1;
int& ans=d[s];
ans=-(1<<30); //考虑到无解这种情况
for(int i=1;i<=n;++i)
if(s>=v[i])
{
ans=max(ans,dp(s-v[i])+1);
}
return ans;
}