1. 程式人生 > 其它 >CodeForces 189 A.Cut Ribbon

CodeForces 189 A.Cut Ribbon

技術標籤:codeforces演算法動態規劃

Topic:

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

  1. After the cutting each ribbon piece should have length a, b or c.
  2. 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;
}