A. Fast Food Restaurant
Problem Restatement
由于Denis工作得很累,他想开家餐厅。
第一天,他做了 \(a\) 份饺子,\(b\) 份莓果汁和 \(c\) 份淋有炼乳的松饼。
Denis餐厅奇怪的地方在于订餐的过程。对于每位客人Denis会自己选一份套餐给客人。
Denis选套餐的规则是这样的:
- 每个客人都要至少有一份食物(饺子、莓果汁、淋有炼乳的松饼都是食物)。
- 每个客人不能收到多于一份饺子,不能收到多于一份莓果汁,且不能收到多于一份淋有炼乳的松饼。
- 每个客人都要有不一样的套餐。
Denis最多可以为几个客人提供套餐呢?
Solution
最开始看错题了,没看到第二点,所以写了个01背包问题版的动态规划,QAQ。
那既然看错题了,就当通用版讲吧。把每一个套餐当作01背包里物品,然后和01背包问题一样DP即可。具体可以看代码。
Code
#include <bits/stdc++.h>
using namespace std;
int dp[11][11][11];
void solve(){
int a,b,c;
scanf("%d %d %d", &a, &b, &c);
memset(dp,0,sizeof(dp));
for(int i=0;i<=1;i++)
for(int j=0;j<=1;j++)
for(int k=0;k<=1;k++){
if(i+j+k==0)continue;
for(int ii=a;ii>=i;ii--)
for(int jj=b;jj>=j;jj--)
for(int kk=c;kk>=k;kk--){
dp[ii][jj][kk]=max(dp[ii][jj][kk],dp[ii-i][jj-j][kk-k]+1);
}
}
printf("%d\n", dp[a][b][c]);
}
int main(){
int T;
scanf("%d", &T);
while(T--){
solve();
}
return 0;
}