Codeforces Round #119 (Div. 2)A. Cut Ribbon
1 second
256 megabytes
standard input
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 a, b 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.
The first line contains four space-separated integers n, a, b 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 a, b and c can coincide.
Print a single number — the maximum possible number of ribbon pieces. It is guaranteed that at least one correct ribbon cutting exists.
5 5 3 2
2
7 5 5 2
2
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 ;
}
最新文章
- Oracle中日期时间的操作比较和加减-入门基础(转)
- FreeBSD 配置
- Codeforces Round #233 (Div. 2) B. Red and Blue Balls
- 真正的让iframe自适应高度 兼容多种浏览器随着窗口大小改变
- bzoj 2659: [Beijing wc2012]算不出的算式
- GPS 坐标距离计算
- LeetCode Populating Next Right Pointers in Each Node (技巧)
- Oracle创建序列
- 数据添加到DataTable
- 异步请求HTTP
- 二分查找里的upper bound与lower bound的实现与分析
- 【C#爬虫】抓取XX网站mp4资源地址
- 完善GDAL与OpenCV间的数据格式转换与影像分块读写
- 微软系统工具套件SysinternalsSuite各个工具功能说明
- Spring Security(15)——权限鉴定结构
- [Unity Asset]AssetBundle系列——游戏资源打包
- Spring 实现自定义 bean 的扩展
- 2016普及组t3海港
- io使用的设计模式
- XXE漏洞学习