分辣条2
发布时间: 2016年7月2日 21:47 最后更新: 2016年7月2日 21:51 时间限制: 1000ms 内存限制: 128M
啊啊有根很大的辣条,重量为n,啊啊想把辣条分给很多小朋友,但是必须满足下列条件:
1.每个小朋友分得的辣条重量为a,b或c;
2.分得辣条的小朋友的数量最多;
3.没有剩余的辣条,也就是说所有辣条都分完啦。
帮帮啊啊找出能分得辣条小朋友的数量。
有多组数据,每组数据包含4个整数n,a,b,c(1<=n,a,b,c<=4000)
每组数据输出能分得辣条的小朋友数量,每组输出占一行
复制
5 5 3 2
2
复制
7 5 5 2
2
/** 完全背包,必须装满,最大化 **/ #include<iostream> #include<cstdio> using namespace std; const int maxn = 4005; const int INF = 0x3f3f3f3f; int dp[maxn], a[3]; int main(void) { int n; while(cin >> n >> a[0] >> a[1] >> a[2]) { dp[0] = 0; for(int i = 1; i <= n; i++) dp[i] = -INF; for(int i = 0; i < 3; i++) for(int j = 0; a[i]+j <= n; j++) if(dp[j] != -INF) dp[j+a[i]] = max(dp[j+a[i]], dp[j]+1); //if(dp[n] == -INF) .... dp[n]没有变化过,即没有装满的情况,但题目说一定可以分完,所以不需加这判断 printf("%d\n", dp[n]); } return 0; }