蓝桥杯算法提高-贪吃的大嘴
贪吃的大嘴
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 }
本文来自博客园,作者:泥烟,CSDN同名, 转载请注明原文链接:https://www.cnblogs.com/Knight02/p/16094055.html