A. Cut Ribbon
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Polycarpus has a ribbon, its length is n. He wants to cut the ribbon in a way that fulfils the following two conditions:

  • After the cutting each ribbon piece should have length ab or c.
  • After the cutting the number of ribbon pieces should be maximum.

Help Polycarpus and find the number of ribbon pieces after the required cutting.

Input

The first line contains four space-separated integers nab and c (1 ≤ n, a, b, c ≤ 4000) — the length of the original ribbon and the acceptable lengths of the ribbon pieces after the cutting, correspondingly. The numbers ab and c can coincide.

Output

Print a single number — the maximum possible number of ribbon pieces. It is guaranteed that at least one correct ribbon cutting exists.

Examples
input
5 5 3 2
output
2
input
7 5 5 2
output
2
Note

In the first example Polycarpus can cut the ribbon in such way: the first piece has length 2, the second piece has length 3.

In the second example Polycarpus can cut the ribbon in such way: the first piece has length 5, the second piece has length 2.

这题n^2枚举可以解决,但是也可以用dp O(n)啊

dp得到的数。

dp[i]代表 组成i 需要的最多ribbon块数。

/* ***********************************************
Author :guanjun
Created Time :2016/10/7 18:22:02
File Name :cf119a.cpp
************************************************ */
#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 10010
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << ;
const double eps=1e-;
using namespace std;
priority_queue<int,vector<int>,greater<int> >pq;
struct Node{
int x,y;
};
struct cmp{
bool operator()(Node a,Node b){
if(a.x==b.x) return a.y> b.y;
return a.x>b.x;
}
}; bool cmp(int a,int b){
return a>b;
}
int dp[];
int main()
{
#ifndef ONLINE_JUDGE
//freopen("in.txt","r",stdin);
#endif
//freopen("out.txt","w",stdout);
int n,a,b,c;
while(cin>>n>>a>>b>>c){
cle(dp);
dp[a]=dp[b]=dp[c]=;
for(int i=;i<=n;i++){
if(i>a&&dp[i-a])dp[i]=max(dp[i],dp[i-a]+);
if(i>b&&dp[i-b])dp[i]=max(dp[i],dp[i-b]+);
if(i>c&&dp[i-c])dp[i]=max(dp[i],dp[i-c]+);
}
cout<<dp[n]<<endl;
}
return ;
}

最新文章

  1. Oracle中日期时间的操作比较和加减-入门基础(转)
  2. FreeBSD 配置
  3. Codeforces Round #233 (Div. 2) B. Red and Blue Balls
  4. 真正的让iframe自适应高度 兼容多种浏览器随着窗口大小改变
  5. bzoj 2659: [Beijing wc2012]算不出的算式
  6. GPS 坐标距离计算
  7. LeetCode Populating Next Right Pointers in Each Node (技巧)
  8. Oracle创建序列
  9. 数据添加到DataTable
  10. 异步请求HTTP
  11. 二分查找里的upper bound与lower bound的实现与分析
  12. 【C#爬虫】抓取XX网站mp4资源地址
  13. 完善GDAL与OpenCV间的数据格式转换与影像分块读写
  14. 微软系统工具套件SysinternalsSuite各个工具功能说明
  15. Spring Security(15)——权限鉴定结构
  16. [Unity Asset]AssetBundle系列——游戏资源打包
  17. Spring 实现自定义 bean 的扩展
  18. 2016普及组t3海港
  19. io使用的设计模式
  20. XXE漏洞学习

热门文章

  1. C_动态库|静态库
  2. Xamarin.Forms android实现沉浸式
  3. 12Cookie、Session
  4. UVA - 1615 Highway(贪心-区间选点问题)
  5. linux cmp-比较两个文件是否有差异
  6. 微信小程序开发过程中tabbar页面显示的相关问题及解决办法!
  7. pandas 处理 excel
  8. Datatable 插入一行数据到第一行
  9. Cmake的介绍和使用 Cmake实践
  10. codeforces round #394 (div. 2) A\B 题解