#include <iostream>
#include <limits>
using namespace std;
int main()
{
int m,n;
int a[21];
int dp[101];
int i,j;
while(cin>>m>>n)
{
dp[0] = 0;
for(i=1; i<=m; ++i)
{
dp[i] = numeric_limits<int>::max();
}
for(i=1; i<=n; ++i)
{
cin>>a[i];
}
for(i=1; i<=n; ++i)
{
for(j=m; j>=a[i]; j--)
{
if(dp[j-a[i]]!=numeric_limits<int>::max() && dp[j]>dp[j-a[i]]+1)
{
dp[j] = dp[j-a[i]] + 1;
}
}
}
if(dp[m] == numeric_limits<int>::max())
cout<<0<<endl;
else
cout<<dp[m]<<endl;
}
return 0;
}
正好装满的0-1背包问题。。。在dp数组上初始化是很有技巧的……

本文深入探讨了0-1背包问题的解决方法,通过动态规划算法实现最优解。着重介绍了如何在dp数组上进行巧妙的初始化,以提高算法效率。通过实例分析,展示了动态规划在资源分配问题上的应用。
2520

被折叠的 条评论
为什么被折叠?



