题目描述
生产口罩
时间限制 :1sec / 空间限制: 256MB
题意:
牛妹是一家口罩厂家的老板,由于现在疫情严重,牛妹想重新分配每条生产线上的人数来使得能生产的口罩最多。
牛妹所在的公司一共有mm名员工,nn条生产线(0…n-1),每条生产线有strategy[i].size种人数安排策略。例如:33个人在aa生产线上,aa生产线每天生产88个口罩;55个人在aa生产线上,每天aa生产线能生产1515个口罩。
牛妹想知道通过合理的策略安排最多每天能生产多少口罩?(可以不用将所有员工都分配上岗,生产线可以选择闲置)
输入:
给定n,m,strategy数组
1≤n,m≤2∗103
strategy[i].size≤3000
输出:
返回每天最大的口罩生产数量
示例1
输入
复制
3,5,[[(1,3),(2,4)],[(3,4),(4,4)],[(8,8)]]
输出
复制
8
说明
样例解释: 11号生产线采用策略22,22号生产线采用策略11,33号生产线不生产
int producemask(int n, int m, vector<vector<Point> >& strategy) {
// 类似找钱的策略 100块可以由多少1,5组合法.
//则在用总共i组线以及j个人来组成时,组成dp[i][j];
//当i组线不使用时 则为使用前i-1组线的情况下 组成j的最大值.dp[i-1][j]
//当i组线使用时,则为使用前i-1组线的情况下 组成j的最大值,并且和组内组成j的情况下.组内不停的迭代max(dp[0][aim-p.x]+p.y,dp[i][j])
vector<vector<int>> dp(n+1, vector<int>(m + 1, 0));
for (int i = 1; i <=n; i++)
for (int j = 1; j <= m; j++)
{
dp[i][j]=dp[i-1][j];
for (auto p : strategy[i-1])
{
if(j < p.x) continue;
dp[i][j] = max(dp[i-1][j-p.x]+p.y,dp[i][j]);
}
}
return dp[n][m];
}