CF1313A Fast Food Restaurant

A. Fast Food Restaurant

原题传送门

Problem Restatement

由于Denis工作得很累,他想开家餐厅。

第一天,他做了 \(a\) 份饺子,\(b\) 份莓果汁和 \(c\) 份淋有炼乳的松饼。

Denis餐厅奇怪的地方在于订餐的过程。对于每位客人Denis会自己选一份套餐给客人。

Denis选套餐的规则是这样的:

  1. 每个客人都要至少有一份食物(饺子、莓果汁、淋有炼乳的松饼都是食物)。
  2. 每个客人不能收到多于一份饺子不能收到多于一份莓果汁且不能收到多于一份淋有炼乳的松饼
  3. 每个客人都要有不一样的套餐。

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;
}

猜你喜欢

转载自www.cnblogs.com/leachim/p/12388628.html