Description
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.
Sample Input
Input
5 5 3 2
Output
2
Input
7 5 5 2
Output
2
#include<stdio.h> int main() { int n,a,b,c,s; int i,j,m=0; scanf("%d %d %d %d",&n,&a,&b,&c); for(i=0;i<=n/a;i++) for(j=0;j<=n/b;j++) { if((n-i*a-b*j)%c==0&&(n-i*a-b*j)>=0) { if(m<((n-i*a-b*j)/c+i+j)) m=(n-i*a-b*j)/c+i+j; } } printf("%d\n",m); return 0; }
运用背包求解
#include<stdio.h> int max(int a,int b) { return a>b?a:b; } int main() { int n,a,b,c,s,i; int p[10000]; scanf("%d %d %d %d",&n,&a,&b,&c); for(i=1;i<=n;i++) p[i]=-99999999; p[0]=0; for(i=1;i<=n;i++) { if(i-a>=0) p[i]=max(p[i],p[i-a]+1); if(i-b>=0) p[i]=max(p[i],(p[i-b]+1)); if(i-c>=0) p[i]=max(p[i],(p[i-c]+1)); } printf("%d",p[n]); return 0; }
这里犯了一个错误就是初始化问题
开始我把数组初始化为0但是初始化为0
这样的话第2组数据输出便是3不是2,为什么?因为f[7]=f[5]+1;
看下图: