蓝桥杯算法提高-贪吃的大嘴

贪吃的大嘴
 

Description

 

有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕,而且大嘴还特别懒,她希望通过吃数量最少的小蛋糕达到这个目的.所以她希望你能设计一个程序帮她决定要吃哪些小蛋糕.

 

Input

 

先输入一行包含2个整数m、n,表示大嘴需要吃美味度和为m的小蛋糕,而小蛋糕一共有n种,下面输入n行,每行2个整数,第一个表示该种小蛋糕的美味度,第二个表示蛋糕店中该种小蛋糕的总数。

 

Output

 

输出一行包含一个整数表示大嘴最少需要吃的小蛋糕数量,若大嘴无法通过吃小蛋糕达到m的美味度和,则输出"><“。

 

Sample Input 1 

10 2
4 1
2 10

Sample Output 1

4

Hint

HINT:时间限制:1.0s 内存限制:256.0MB

m ≤ 20000,小蛋糕总数量≤50.

Source

蓝桥杯练习系统 ID: 322 原题链接: http://lx.lanqiao.cn/problem.page?gpid=T322

 

 

这个题算是多重背包板子题,但是要注意一些区别
1.题目要求的是最少吃多少个蛋糕,而不是最多能吃多少个或者说最多能吃到的美味值是多少
2.数据量不大,二进制优化不是必须的
3.初始值的设置,因为我们要求的最小值,所以可以简单的认为dp表里的元素一开始都是最大值,但是如果这样写了,会发现最后得到的也是最大值,因为还要对dp[0]特殊处理,一般状态都是从这个位置开始转移的,所以要把dp[0]设置为0,这样才能求到最小值

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int N=20010;
 5 int f[N];
 6 int main(){
 7     int m,n,w,s;
 8     cin>>m>>n;
 9     fill(f+1,f+N,N);
10     for(int i=1;i<=n;i++){
11         cin>>w>>s;
12         for(int j=m;j>=w;j--)
13             for(int k=1;k<=s&&k*w<=j;k++)
14                 f[j]=min(f[j],f[j-k*w]+k);
15     }
16     if(f[m]!=N) cout<<f[m]<<endl;
17     else cout<<"><"<<endl;
18     return 0;
19 }

 

posted @ 2022-04-02 21:32  泥烟  阅读(87)  评论(0编辑  收藏  举报