zoukankan      html  css  js  c++  java
  • 题目1209:最小邮票数(01背包)

     1 //题目1209:最小邮票数题目描述:
     2 //有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。
     3 //如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。
     4 #include "stdafx.h"
     5 #pragma warning(disable:4996)
     6 #include <iostream>
     7 #include <stdio.h>
     8 #include <cstring>
     9 #include <algorithm>
    10 using namespace std;
    11 
    12 int v,N;
    13 int w[1000];
    14 int dp[1000];
    15 #define inf 1000000
    16 int min(int a,int b)
    17 {
    18     return a>b?b:a;
    19 }
    20 void solve()
    21 {
    22     memset(dp,inf,sizeof(dp));
    23 
    24     dp[0] = 0;
    25     for (int i=1;i<=N;++i)//遍历物品
    26     {
    27         for (int j=v;j>=w[i];--j)//遍历体积,价值为1,也即邮票的张数,我们要取得最小的价值。
    28         {
    29             dp[j]=min(dp[j],dp[j-w[i]]+1);
    30         }
    31     }
    32     if(dp[v] >=1000)
    33         cout << 0 << endl;
    34     else
    35         cout << dp[v] << endl;
    36 }
    37 int main()
    38 {
    39     freopen("a.txt","r",stdin);
    40     while (cin>>v>>N)
    41     {
    42         for (int i=1;i<=N;++i)
    43         {
    44             scanf("%d",&w[i]);
    45         }
    46         solve();
    47     }
    48     return 0;
    49 }

     恰好装满的01背包问题,注意f[0]=0这个初始化,它表示背包容量为0的时候,没有任何物品可以放入背包的状态。

    另外需注意该题是求最小的个数,也即物品最小的价值数,所以f[v]刚开始要初始化为正无穷这个无效状态。

  • 相关阅读:
    模拟黑客入侵,恶搞小伙伴的利器
    牛客网算法竞赛难题
    ybt ——1346【例4-7】亲戚
    FBI树
    noi2020第二题
    noi2020第一题
    Happiness
    YiJuWuLiaoDeHua
    挂掉了一个u盘
    NOIp2020
  • 原文地址:https://www.cnblogs.com/fightformylife/p/4039756.html
Copyright © 2011-2022 走看看