https://www.nowcoder.com/practice/83800ae3292b4256b7349ded5f178dd1?tpId=40&tqId=21345&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking
有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。
01背包dp[j]为容量为j的背包最少装物品数;
dp[j]=min(dp[j],dp[j-a[i]]+1)
#include <iostream>
using namespace std;
int a[1005];
int dp[1005];
int main()
{
int n,sum;
while(cin>>sum>>n)
{
for(int i=0;i<1000;i++)
dp[i]=999999;
for(int i=0;i<n;i++)
cin>>a[i];
dp[0]=0;
for(int i=0;i<n;i++)
{
for(int j=sum;j>=a[i];j--)
{
dp[j]=min(dp[j],dp[j-a[i]]+1);
}
}
if(dp[sum]>100)
cout<<"0"<<endl;
else
cout<<dp[sum]<<endl;
}
return 0;
}