Topic:
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.
Input :
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.
Output :
Print a single number — the maximum possible number of ribbon pieces. It is guaranteed that at least one correct ribbon cutting exists.
Example :
Node :
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.
Code :
dp
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 5010
int main()
{
int n;
int a[4],x[N];
scanf_s("%d %d %d %d",&n,&a[0],&a[1],&a[2]);
memset(x,-1,sizeof(x)); //对x全部赋值为-1
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;
}
枚举
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{
int n,a,b,c;
int i,j,t,max=0;
scanf("%d %d %d %d",&n,&a,&b,&c);
for(i=0;i*a<=n;i++)
{
for(j=0;i*a+j*b<=n;j++)
{
if((n-i*a-j*b)%c==0&&(n-i*a-j*b)/c+i+j>max)
{
max=(n-i*a-j*b)/c+i+j;
}
}
}
printf("%d\n",max);
return 0;
}