Codeforces Round #622 (Div. 2) A題【Fast Food Restaurant】題解

在我的博客食用效果更佳!https://www.cbw2007.tk/articles/CF-622-div2-A-sol/,更多見在不同的網站瀏覽本站內容

原題鏈接:Problem - A - CodeforcesCF1313A Fast Food Restaurant - 洛谷 | 計算機科學教育新生態

簡化題意

一共有3種食物A、B、C,每一種食物可以選至多1個或不選(也就是說要麼不拿,要麼只拿一個)。現在已知A,B,C各有多少份,在每個人都至少要拿任意一份食物時,問最多能派發給多少人。

思路

  1. 打表,因爲數據範圍小,勉勉強強還行
  2. 暴力,數據範圍小,也比較簡單
  3. 動規,這也是我們的重頭戲

沒錯,動規!這道題其實可以看做多維費用揹包(沒見過的可以去OI-wiki惡補一下:Link),有3種東西,飯店持有的數量可以看做揹包容量,而物品就需要枚舉一下所有可能性,最後看最多能選多少物品。

代碼

#include<iostream>
#include<cstring>
using namespace std;
int cost[7][3]={{1,0,0},{0,1,0},{0,0,1},{1,1,0},{1,0,1},{0,1,1},{1,1,1}};//每種可能性各需要每種食物多少個
int dp[20][20][20];
int main()
{
	int t;
	cin>>t;//多組數據
	while (t--)
	{
		memset(dp,0,sizeof(dp));//首先每次清零
		int a,b,c;
		cin>>a>>b>>c;//輸入每種食物各有多少個
//		dp[0][0][0]=1;//這個我一開始弄錯了,在所有食物一個都沒有時不應該有方案
		for (int k=0;k<7;k++)//揹包模板
			for (int ai=a;ai>=cost[k][0];ai--)//因爲每種食物只能選一次,故倒序(01揹包)
				for (int bi=b;bi>=cost[k][1];bi--)
					for (int ci=c;ci>=cost[k][2];ci--)
						dp[ai][bi][ci]=max(dp[ai][bi][ci],dp[ai-cost[k][0]][bi-cost[k][1]][ci-cost[k][2]]+1);//揹包動規,懂的自然懂
		cout<<dp[a][b][c]<<endl;//在每種食物數量最多的時候肯定最優啦,輸出~
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章