题目链接:http://codeforces.com/contest/910/problem/B
题意:有长度为n的木板,有2扇一样的门,每个门有需要用2个长度为a的板子和一个长度为b的板子,并且对一个板子不能由剩余木板拼凑而来。
题解:可以dp,可以枚举排列、
/*
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, a, b;
scanf("%d %d %d", &n, &a, &b);
int t = 10;
vector<int>V{a,a,a,a,b,b};
sort(V.begin(),V.end());
do {
int tt = 1;
int now = n;
for(int i = 0;i < 6;i ++) {
if(now < V[i]) now = n, tt ++;
now -= V[i];
}
t = min(t, tt);
}while(next_permutation(V.begin(),V.end()));
printf("%d\n",t);
return 0;
}
*/
/*
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
bool can[N][N];
int dp[N][N];
int main()
{
int n, a, b;
scanf("%d %d %d", &n, &a, &b);
memset(dp, 0x3f, sizeof(dp));
dp[0][0] = 0;
for(int i = 0;i <= 4;i ++) {
for(int j = 0;j <= 2;j ++) {
if(i * a + j * b <= n) can[i][j] = 1;
}
}
can[0][0] = 0;
for(int i = 0;i <= 4;i ++) {
for(int j = 0;j <= 2;j ++) {
for(int k = i;k >= 0;k --) {
for(int p = j;p >= 0;p --) {
if(can[k][p]) dp[i][j] = min(dp[i][j], 1 + dp[i-k][j-p]);
}
}
}
}
return !printf("%d\n",dp[4][2]);
}
*/
#include <bits/stdc++.h>
using namespace std;
using ll = long long ;
using ld = long double;
#define pb push_back
#define SZ(X) ((int)X.size())
#define mp make_pair
#define Fi first
#define Se second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pli pair<ll,int>
#define pil pair<int,ll>
#define ALL(X) X.begin(),X.end()
#define RALL(X) X.rbegin(),X.rend()
#define rep(i,j,k) for(int i = j;i <= k;i ++)
#define per(i,j,k) for(int i = j;i >= k;i --)
#define mem(a,p) memset(a,p,sizeof(a))
const int N = 10, INF = 1<<20;
int dp[N][N];
bool can[N][N];
int n, a, b;
int gao(int p1, int p2)
{
if(dp[p1][p2] != INF) return dp[p1][p2];
rep (i,0,p1) {
rep (j,0,p2) {
if(can[i][j]) dp[p1][p2] = min(dp[p1][p2], gao(p1-i,p2-j)+1);
}
}
return dp[p1][p2];
}
int main()
{
scanf("%d %d %d",&n,&a,&b);
rep(i,0,4) {
rep(j,0,2) {
if(i * a + j * b <= n) can[i][j] = 1;
dp[i][j] = INF;
}
}
dp[0][0] = 0;
can[0][0] = 0;
return !printf("%d\n", gao(4,2));
}