最小邮票数 01背包

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;
}
    原文作者:B树
    原文地址: https://blog.csdn.net/aonaigayiximasi/article/details/79410249
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞