http://codeforces.com/problemset/problem/189/A
A. Cut Ribbontime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputPolycarpus 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.
OutputPrint a single number — the maximum possible number of ribbon pieces. It is guaranteed that at least one correct ribbon cutting exists.
Sample test(s)input5 5 3 2output
2input
7 5 5 2output
2Note
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.
这个是完全背包里面的必须装满的一类问题,注意和不必须装满的区别,代码上有区别~~#include <iostream>
using namespace std;
const int INF=1e9;
int f[4444];
int n,m;
int a[4];
int main()
{
cin>>n>>a[0]>>a[1]>>a[2];
for (int i=1; i<=n; i++) f[i]=-INF;//区别一
f[0]=0;
for (int i=0; i<=2; i++)
{
for (int j=0; j<=n-a[i]; j++)
{
if (f[j]!=-INF)//区别二
{
f[j+a[i]]=max(f[j+a[i]],f[j]+1);
}
}
}
cout<<f[n]<<endl;
return 0;
}