码迷,mamicode.com
首页 > 其他好文 > 详细

Door Frames CodeForces - 910B

时间:2020-11-30 16:00:25      阅读:6      评论:0      收藏:0      [点我收藏+]

标签:题目   for   暴力   integer   upper   部分   and   color   minimal   

题目

Petya has equal wooden bars of length n. He wants to make a frame for two equal doors. Each frame has two vertical (left and right) sides of length a and one top side of length b. A solid (i.e. continuous without breaks) piece of bar is needed for each side.

Determine a minimal number of wooden bars which are needed to make the frames for two doors. Petya can cut the wooden bars into any parts, but each side of each door should be a solid piece of a wooden bar (or a whole wooden bar).

Input

The first line contains a single integer n (1?≤?n?≤?1?000) — the length of each wooden bar.

The second line contains a single integer a (1?≤?a?≤?n) — the length of the vertical (left and right) sides of a door frame.

The third line contains a single integer b (1?≤?b?≤?n) — the length of the upper side of a door frame.

Output

Print the minimal number of wooden bars with length n which are needed to make the frames for two doors.

Examples

Input

8
1
2

Output

1

Input

5
3
4

Output

6

Input

6
4
2

Output

4

Input

20
5
6

Output

2

Note

In the first example one wooden bar is enough, since the total length of all six sides of the frames for two doors is 8.

In the second example 6 wooden bars is enough, because for each side of the frames the new wooden bar is needed.

 

题意

给你若干根长度为n的木棍,从木棍中截取4段长度为a的段,2段长度为b的段,求使用木棍的最小值。保证1?≤?n?≤?1?000,1?≤?b?≤?n,1?≤?a ≤?n。

题解

cf上给的标签是贪心,很多网上的题解的解法是暴力,我却用 dp写出来了。

问题是在一个木棍上截取你需要的长度要求使用木棍最小化,截取的长度是互相独立,互不影响的,所以我们只需要,使每一根棍截取的长度都最大,就可以得到最小化的木棍使用数,换句话说,我们要使每根木棍截取后浪费的部分最小化。先不考虑多根棍的情况,单独考虑一根,那问题就会简化成简单的多重背包问题,一个空间为n,物品的价值等于重量,的多重背包,物品有4个a,2个b。

所以我们有状态dp[i] 为总共截取的长度为i,是否能截取。

状态转移为

dp[0]=1;

 dp[i]=dp[i-w[i]]; w[]={a,a,a,a,b,b} (直接把多重背包化简成01背包)

 

这样就可以得到一根木棍的最优截取,但我们要考虑的不仅仅是一根木棍,并且,我们的物品也不是一成不变的,比如上一次截取了,两个b那下一次就只有4个a了,解决起来也很简单,多次重复以上dp就好,就如上面说的,每一根棍截取的长度都最大,就可以得到最小化的木棍使用数。还有一个问题是不同物品的,解决起来也很简单,我们上面那个动态规划状态只是能否截取,我们改成截取的方案,这样动态规划后再从物品集中去除以用的就好。由于a,b的 物品是固定的而且很小,我直接用十进制的个位数和十位数代表ab的个数。

复杂度为O(N) (dp重复次数不超过6次)

AC代码

 1 #include<iostream>
 2 #include<queue>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 int dp[1005];
 7 struct node{
 8     int len,id;
 9     node(int a,int b):len(a),id(b){}
10 };
11 queue<node>q;
12 
13 void push(int a,int ca,int b,int cb){
14     while(ca--)q.push(node(a,1));
15     while(cb--)q.push(node(b,10));
16 }
17 
18 void fc(int n,int& ca,int& cb){
19     for(int i=n;i>=0;i--){
20         if(dp[i]){
21             ca-=dp[i]%10;
22             cb-=dp[i]/10;
23             return;
24         }
25     }
26 }
27 
28 int main(){
29     int n,a,b,ca=4,cb=2,ans=0;
30     scanf("%d%d%d",&n,&a,&b);
31 
32     while(ca||cb){
33         push(a,ca,b,cb);
34         memset(dp,0,sizeof dp);
35         while(q.size()){
36             node tmp=q.front();
37             q.pop();
38             for(int i=n;i>=tmp.len;i--){
39                 if(dp[i-tmp.len]!=0||i-tmp.len==0)
40                     dp[i]=dp[i-tmp.len]+tmp.id;
41             }
42         }
43         fc(n,ca,cb);
44         
45         ans++;
46     }
47     printf("%d\n",ans);
48     scanf(" ");
49     return 0;
50 
51 
52 }

 

Door Frames CodeForces - 910B

标签:题目   for   暴力   integer   upper   部分   and   color   minimal   

原文地址:https://www.cnblogs.com/komet/p/14036299.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!