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.
【题意】给你一根绳子称为d,现在要将绳子分成若干段,使得每一段的长度必须是a,b,c中的一个,求分得的最多段数。
【分析】简单DP,dp[i]代表切到当前位置获得的最大段数,慢慢更新即可。
#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define vi vector<int> #define inf 0x3f3f3f3f using namespace std; typedef long long LL; const int N = 1e5+50; int n; int a,b,c; int dp[N]; void solve(int i,int x){ if(i-x==0)dp[i]=max(dp[i],1); else if(i-x<0)dp[i]=max(dp[i],0); else dp[i]=max(dp[i],dp[i-x]==0?0:dp[i-x]+1); } int main(){ scanf("%d%d%d%d",&n,&a,&b,&c); for(int i=1;i<=n;i++){ solve(i,a); solve(i,b); solve(i,c); } printf("%d ",dp[n]); return 0; }