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;
}