time limit per test : 1 second
memory limit per test : 256 megabytes
input : standard input
output : standard output
Polycarpus has a ribbon, its length is n n n. He wants to cut the ribbon in a way that fulfils the following two conditions:
Help Polycarpus and find the number of ribbon pieces after the required cutting.
The first line contains four space-separated integers n n n, a a a, b b b and c c c ( 1 ≤ n , a , b , c ≤ 4000 ) (1 ≤ n, a,b, c≤ 4000) (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 a a, b b b and c c 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.
input
5 5 3 2
output
2
input
7 5 5 2
output
2
In the first example Polycarpus can cut the ribbon in such way: the first piece has length 2 2 2, the second piece has length 3 3 3.
In the second example Polycarpus can cut the ribbon in such way: the first piece has length 5 5 5, the second piece has length 2 2 2.
完全背包,看成给出三种商品,恰好能够装满背包的情况
注意初始化的问题,如果把 d p dp dp数组全部初始化为 − 1 -1 −1的话,需要注意 d p [ j ] = − 1 & & d p [ j − a [ i ] ] = − 1 dp[j]=-1\&\&dp[j-a[i]]=-1 dp[j]=−1&&dp[j−a[i]]=−1的情况。或者就全部初始值给成小于 − 1 -1 −1的数
/*************************************************************************
> Author: WZY
> School: HPU
> Created Time: 2019-04-01 18:30:38
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define ull unsigned long long
#define lson o<<1
#define rson o<<1|1
#define ms(a,b) memset(a,b,sizeof(a))
#define SE(N) setprecision(N)
#define PSE(N) fixed<
#define bug cerr<<"-------------"<
#define debug(...) cerr<<"["<<#__VA_ARGS__":"<<(__VA_ARGS__)<<"]"<<"\n"
#define LEN(A) strlen(A)
const double E=exp(1);
const double eps=1e-9;
const double pi=acos(-1.0);
const int mod=1e9+7;
const int maxn=1e6+10;
const int maxm=1e3+10;
const int moha=19260817;
const int inf=1<<30;
const ll INF=1LL<<60;
using namespace std;
inline void Debug(){cerr<<'\n';}
inline void MIN(int &x,int y) {if(y<x) x=y;}
inline void MAX(int &x,int y) {if(y>x) x=y;}
inline void MIN(ll &x,ll y) {if(y<x) x=y;}
inline void MAX(ll &x,ll y) {if(y>x) x=y;}
template<class FIRST, class... REST>void Debug(FIRST arg, REST... rest){
cerr<<arg<<"";Debug(rest...);}
int dp[maxn];
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);cin.tie(0);
cout.precision(20);
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
srand((unsigned int)time(NULL));
#endif
int n;
int a[4];
cin>>n>>a[0]>>a[1]>>a[2];
ms(dp,-1);
dp[0]=0;
for(int i=0;i<3;i++)
for(int j=a[i];j<=n;j++)
if(dp[j-a[i]]!=-1)
MAX(dp[j],dp[j-a[i]]+1);
cout<<dp[n]<<endl;
#ifndef ONLINE_JUDGE
cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s.\n";
#endif
return 0;
}