9.29-贪心算法(//活动安排//0-1背包//装载问题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengchencheng/article/details/82901924

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

猜你喜欢

转载自blog.csdn.net/chengchencheng/article/details/82901924