1. 程式人生 > >9.29-貪心演算法(//活動安排//0-1揹包//裝載問題)

9.29-貪心演算法(//活動安排//0-1揹包//裝載問題)

1.活動安排

描述:Jack是一名nwpu的大一新生,對學校舉辦的各種活動都十分的好奇,想盡可能多的參加這些活動。Npwu每天共有N項活動,其開始結束時間分別為B[i],E[i],(i = 1,2,……N)
請問Jack一天最多能參加幾項活動。當然,Jack在同一時間內只能參加一項活動,即jack參加的活動時間上不能重疊,但時間為[t1,t2],[t2,t3]的兩個活動是可以同時參加的。

輸入:第一行 一個整數N(1<=n<=1000)表示活動總數。接下來N行表示各活動的起始,結束時間0<=B[i]<E[i]<24

輸出:一個整數表示Jack最多能參加的活動數目。

輸入樣例

4
10 11
2 3
8 10
0 2

輸出樣例

4

#include<iostream>
using namespace std;

int main(){
   int i, j, tmp, num = 0;
   int n;
   int start[1001], end[1001];

   cin >> n;
   for(i = 0; i < n; i++){
       cin >> start[i] >> end[i];
   }

   for(i = 0; i < n-1; i++){
	   for(j = i; j < n; j++){
		   if(end[i] > end[j]){
		       tmp = end[i];
			   end[i] = end[j];
			   end[j] = tmp;
			   tmp = start[i];
			   start[i] = start[j];
			   start[j] = tmp;
		   }
	   }
   }

   i = 0;
   while(i < n){
        for(j = i+1; j < n && start[j] < end[i]; j++);
		num++;
		i = j;
   }

   cout << num << endl;
   return 0;
}

2.0-1揹包

描述:需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi ,價值為pi 。對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。

輸入:多個測例,每個測例的輸入佔三行。第一行兩個整數:n(n<=10)和c,第二行n個整數分別是w1到wn,第三行n個整數分別是p1到pn。
n 和 c 都等於零標誌輸入結束。

輸出:每個測例的輸出佔一行,輸出一個整數,即最佳裝載的總價值。

輸入樣例

1 2
1
1
2 3
2 2
3 4
0 0

輸出樣例

1
4

#include<iostream>
#include<string.h>
using namespace std;

int main(){
   int i, j;
   int n, c;
   int w[100], p[100], f[100][100];

   while(1){
          cin >> n >> c;
		  if(n == 0 && c == 0){
		      break;
		  }
          for(i = 1; i <= n; i++){
              cin >> w[i];
          }
          for(i = 1; i <= n; i++){
              cin >> p[i];
          }
		  memset(f,0,sizeof(f));
          for(i = 1; i <= n; i++){
	          for(j = c; j >=w[i]; j--){
	              f[i][j] = (f[i-1][j] > (f[i-1][j-w[i]] + p[i])) ? f[i-1][j] : (f[i-1][j-w[i]]+p[i]);
	          }
          }
          cout << f[n][c] <<endl;
   }
   return 0;
}

3.裝載問題

描述:有兩艘船,載重量分別是c1、 c2,n個集裝箱,重量是wi (i=1…n),且所有集裝箱的總重量不超過c1+c2。確定是否有可能將所有集裝箱全部裝入兩艘船。

輸入:多個測例,每個測例的輸入佔兩行。第一行一次是c1、c2和n(n<=10);第二行n個整數表示wi (i=1…n)。n等於0標誌輸入結束。

輸出:對於每個測例在單獨的一行內輸出Yes或No。

輸入樣例

7 8 2
8 7
7 9 2
8 8
0 0 0

輸出樣例

Yes
No

提示:求出不超過c1的最大值max,若總重量-max < c2則能裝入到兩艘船。

#include<iostream>
#include<string.h>
using namespace std;



int main(){
   int i, j;
   int n, c1, c2, num;
   int w[100], f[100][100];
   while(1){
	   num = 0;
       cin >> c1 >> c2 >> n;
	   if(n == 0){
		   break;
	   }
       for(i = 1; i <= n; i++){
           cin >> w[i];
		   num += w[i];
       }
	   memset(f,0,sizeof(f));
       for(i = 1; i <= n; i++){
	      for(j = c1; j >=w[i]; j--){
	          f[i][j] = (f[i-1][j] > (f[i-1][j-w[i]] + w[i])) ? f[i-1][j] : (f[i-1][j-w[i]]+w[i]);
	      }
       }
	   if(num - f[n][c1] <= c2){
	       cout << "Yes" <<endl;
	   }
	   else{
	       cout << "No" <<endl;
	   }
   }
   return 0;
}

相關推薦

9.29-貪心演算法//活動安排//0-1揹包//裝載問題

1.活動安排 描述:Jack是一名nwpu的大一新生,對學校舉辦的各種活動都十分的好奇,想盡可能多的參加這些活動。Npwu每天共有N項活動,其開始結束時間分別為B[i],E[i],(i = 1,2,……N) 請問Jack一天最多能參加幾項活動。當然,Jack在同一時間內只能

貪心演算法會場安排問題、區間選點

學習演算法課程之後的第一次記錄,漸漸的,程式設計考慮的因素增多,程式=資料結構+演算法,這個等式讓我深有體會。從開始簡單的C++程式設計,再到選擇合適資料結構,現在需要更進一步,從演算法層次上考慮程式執行的效率。我對演算法的理解是用更少的開銷獲得更優的執行效果。 分治法、動態規劃在此之前沒有記錄下來,學到貪心

【NOJ1205】【貪心演算法活動安排

1205.活動安排 時限:1000ms 記憶體限制:10000K  總時限:3000ms 描述 Jack是一名nwpu的大一新生,對學校舉辦的各種活動都十分的好奇,想盡可能多的參加這些活動。Npwu每天共有N項活動,其開始結束時間分別為B[i],E[i],(i = 1,

貪心演算法活動安排問題

問題描述: 現在給你一個會場,有許社團需要在這個會場上活動, 已知各個社團在這個會場上活動的時間(起始時間和終止時間) 要求出來怎麼安排 能夠使得這個教室z在這一天之內接待儘可能多的社團  解題思路與演算法思想 已經知道我們有n個活動需要安排 不妨考

0021演算法筆記——【貪心演算法貪心演算法活動安排問題

 1、貪心演算法 (1)原理:在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。

【HDU - 2546】飯卡 dp,0-1揹包貪心思想

電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額為負),否則無法購買(即使金額足夠)。所以大家都希望儘量使卡上的餘額最少。  某天,食堂中有n種菜出售,每種菜可購買一次。已知每種菜

採藥 OpenJ_Bailian - 27260-1揹包問題

#include <stdio.h> #include <string.h> typedef struct Thing {     int time, value; }Ting; Ting thing[11]; int

HDU2955Robberies 0-1揹包問題

題目大意:        一個人要搶劫銀行,在保證被抓概率小於某個預設的概率值時,儘可能搶到更多的錢。 輸入:第一行是一個整數t,代表測試用例的個數            接下來第一行是一個小數P和一個整數N,N代表銀行的個數,P代表概率的上限。            接下

LintCode 125: Backpack II (動態規劃經典題: 0-1揹包問題

解法1: 經典DP解法。 時間複雜度O(MN),空間複雜度O(MN)。 注意:dp[m+1][n+1],如果定義成dp[m][n],dp[0][]就有歧義:到底表示不取任何包,還是取包0呢? class

貪心演算法1—— 活動安排問題 以及 電視節目問題 的區別

一、活動安排問題 #include <iostream> #include <algorithm> using namespace std; /* 題目型別:活動安排問題 特點:所有活動都需要進行,要求輸出所需的會場數 演算法:貪心演算法 注意

【杭電100題】【貪心】2037 今年暑假不AC活動安排問題

今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 77466 &nbs

選擇不相交區間活動安排問題貪心HDU2037

數軸上有n個開區間(ai,bi)。選擇儘量多個區間,使得這些區間兩兩沒有公共點。(這裡的區間可以當作是活動的時間) 分析:個人理解是每一個區間儘可能選小區間,同時使數軸利用率儘可能大。 (1)先對bi進行非減序排序,b1<b2<b3......。 (2)對排序後

藍書演算法競賽進階指南刷題記錄——POJ2976 Dropping tests0-1分數規劃

題目:POJ2976. 題目大意:給定你n組,讓你取出n-k組,使得這n-k組的a之和除以b之和最大. 這是一個經典的0-1分數規劃模型. 關於0-1分數規劃模型,一般就是確定一個標準值mid,發現: 若,那麼,也就是說. 同理,若,就是. 突然發現這個東西滿足二分性質.

16 貪心演算法筆記

釋義 在設計演算法求解最優化問題的過程中,每一步都做出當時看起來最佳的選擇,這樣的演算法稱作貪心演算法,每一步做出的選擇稱作貪心選擇。 設計步驟 將最優化問題轉化為這樣的形式:對其做出一次選擇後,只剩下一個待求解的子問題。 證明做出貪心選擇後,原問題總是存在最優解,

0-1揹包問題-貪心演算法

    今天用貪心演算法給出揹包問題的一種解,雖然貪心演算法不一定是最優解,但是在資料量極大時,貪心演算法可以快速獲得接近最優解的答案 package test; import java.util.ArrayList; import 

貪心演算法

一、問題描述 有15個公司和30種產品。 每個公司生產不同種類任意多種產品,每個公司生成產品都會產生一定的費用。 例如: 需要生產6種產品,分別為 1 5 9 10 11 12 6 1 5 9 10 11 12 共有7個公司生產 7 第一家:需要15萬,生成5種產品,1 3 5

貪心演算法2

King’s Cake HDU 5640 http://acm.hdu.edu.cn/showproblem.php?pid=5640 It is the king’s birthday before the military parade . The ministers

貪心演算法基於C++

文章基於此篇微信推送https://mp.weixin.qq.com/s/3h9iqU4rdH3EIy5m6AzXsg 簡介 動態規劃是一種由問題的最小子狀態(邊界)不斷推出更大的狀態,最後解決整個問題的解題思想。 基礎概念 最優子結構:狀態可被分解為的子狀態

基礎演算法——貪心演算法聖誕老人的禮物

題目是這樣的: 聖誕節來臨了,中聖誕老人準備分發糖果現在有多箱不同的糖果, 每箱糖果有自己的價值和重量,每箱糖果都可以拆分成任意散裝組合帶走。聖誕老人的馴鹿雪橇最多隻能裝下重量W的糖果,請問聖誕老人最多能帶走多大價值的糖果。 4表示四種糖果,下面跟著四行資料,第一個表示價值,第二個

貪心演算法硬幣問題

貪心演算法 貪心演算法區域性最優就是整體最優 #include <cmath> #include <cstring> using namespace std; int money[6]={1,5,10,50,100,500};//表示1、