http://ac.jobdu.com/problem.php?pid=1209
这是一道典型的动态规划0-1揹包问题而且是求恰好等于某值的最优解。做法就是依次加入一张邮票,计算恰好等于M的邮票数,若恰好等于M有多个解,要选择最小的解(这也是我第一次WA没有考虑的情况,dp[m]不为零时要先进行比较,取最小值)。代码如下:
#include <iostream>
using namespace std;
int dp[101],a[21];
int main()
{
int m,n;
while (cin>>m)
{
cin>>n;
for (int i=0;i<n;++i)
cin>>a[i];
for (int i=0;i<=m;++i)
dp[i]=0;
for (int i=0;i<n;++i)
{
for (int j=m;j>=0;--j)
{
if (j>a[i]&&dp[j-a[i]]>0)
{
if (dp[j]>0&&dp[j]<dp[j-a[i]]+1) continue; //取最小值
dp[j]=dp[j-a[i]]+1;
}
else if (j==a[i])
dp[j]=1;
}
}
cout<<dp[m]<<endl;
}
return 0;
}