题目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]刚开始要初始化为正无穷这个无效状态。

转载于:https://www.cnblogs.com/fightformylife/p/4039756.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值