算法提高 貪喫的大嘴

問題描述
  有一隻特別貪喫的大嘴,她很喜歡喫一種小蛋糕,而每一個小蛋糕有一個美味度,而大嘴是很傲嬌的,一定要喫美味度和剛好爲m的小蛋糕,而且大嘴還特別懶,她希望通過喫數量最少的小蛋糕達到這個目的.所以她希望你能設計一個程序幫她決定要喫哪些小蛋糕.
輸入格式
  先輸入一行包含2個整數m、n,表示大嘴需要喫美味度和爲m的小蛋糕,而小蛋糕一共有n種,下面輸入n行,每行2個整數,第一個表示該種小蛋糕的美味度,第二個表示蛋糕店中該種小蛋糕的總數
輸出格式
  輸出一行包含一個整數表示大嘴最少需要喫的小蛋糕數量,若大嘴無法通過喫小蛋糕達到m的美味度和,則輸出"><“.
樣例輸入
10 2
4 1
2 10
樣例輸出
4
樣例輸入
10 2
4 1
7 3
樣例輸出
><
數據規模和約定

  m ≤ 20000,小蛋糕總數量≤50.

這是是一個多重揹包問題  
動態方程 dp[k] = min{dp[k-taste[i]]+1,dp[k]}dp[k]表示美味度爲k時最少的蛋糕數  
就是,將第i個蛋糕拿出去得到的一個最少的找蛋糕數+1,和原蛋糕數相比最小的那個就是結果  
另外一種思路,可以將所有的蛋糕的美味度都放在一個數組,就變成了0-1揹包問題,所需考慮的就是放不放的問題 

#include <iostream>    
#include <algorithm>

using namespace std; 
int dp[20001];
int main() {
	int m,n,taste[51],num[51];//taste數組用來盛放每個蛋糕的美味度,num用來盛放每個蛋糕的數量
	cin>>m>>n;
	for(int i=1;i<=n;i++)
		cin>>taste[i]>>num[i];
	for(int i=1;i<=m;i++)//初始化dp爲INF	
		dp[i]=99999;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=num[i];j++)
			for(int k=m;k>=taste[i];k--)
				dp[k]=min(dp[k-taste[i]]+1,dp[k]);
	if(dp[m]==99999)
		cout<<"><"<<endl;
	else
		cout<<dp[m]<<endl;
	return 0;
}   



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章