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.
InputThe 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。然后,是三个数,a,b,c。就是表示绸缎可以剪成a,b,c的长度。求,最多可以剪多少段?
题解:用dp就能解决问题。想象成背包问题。
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 5010
int main()
{
int n;
int a[4],x[N];
scanf("%d %d %d %d",&n,&a[0],&a[1],&a[2]);
memset(x,-1,sizeof(x));
x[0]=0;
for(int i=0;i<3;i++)
{
for(int j=a[i];j<=n;j++)
{
if(x[j-a[i]]!=-1)
x[j]=max(x[j],x[j-a[i]]+1);
}
}
printf("%d",x[n]);
return 0;
}