版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}