# Dynamic Programming# Greedy# Iteration

e637 - 10465 - Homer Simpson

🔗 前往 ZeroJudge 原題

題目描述

題目要求在給定的時間 t 內,荷馬可以吃到的 Krusty 漢堡和 Kwik-e-Mart 漢堡的最大數量,其中吃一個 Krusty 漢堡需要 m 分鐘,吃一個 Kwik-e-Mart 漢堡需要 n 分鐘。如果無法完全利用時間,則需要輸出浪費的時間。

解題思路

這題可以使用動態規劃的思想來解決。我們可以建立一個陣列 a,其中 a[i] 表示在 i 分鐘內可以吃到的最大漢堡數。初始化 a[0] = 1,表示在 0 分鐘內可以吃 0 個漢堡。然後,我們遍歷所有可能的 Krusty 漢堡數量,並更新 a 陣列。接著,遍歷所有可能的 Kwik-e-Mart 漢堡數量,再次更新 a 陣列。最後,檢查 a[t] 是否為 0。如果為 0,表示無法完全利用時間,則需要從 t-1 開始向後搜索,找到第一個 a[i] 大於 0 的位置,並輸出 a[i]-1t-i

複雜度分析

  • 時間複雜度: O(t)
  • 空間複雜度: O(t)

程式碼

#include <iostream>
using namespace std;
int main(){
	int m,n,t;
	while(cin >> m >> n >> t){
		int a[t+1]={0};
		a[0]=1;
		for(int i=0,tm=t-m;i<=tm;++i){
			if(a[i]){
				int im=i+m;
				a[im]=max(a[i]+1,a[im]);
			}
		}
		for(int i=0,tn=t-n;i<=tn;++i){
			if(a[i]){
				int in=i+n;
				a[in]=max(a[i]+1,a[in]);
			}
		}
		if(a[t]){
			cout << a[t]-1 << "\n";
		}
		else{
			for(int i=t-1;i>=0;--i)
				if(a[i]){
					cout << a[i]-1 << " " << t-i << "\n";
					break;
				}
		}
	}
}

Discussion