运用贪心算法来解决背包问题和活动安排问题。
C/C++:
活动安排:
#include<stdio.h>
typedef struct
{
int id; // 活动编号
int start; // 开始时间
int end; // 结束时间
int YorN; // 是否被选择,0 否, 1 是
} activity, *Pactivity ;
void merge(activity c[], activity d[], int left, int m, int right)
{
int i = left, j = m + 1, k = left;
while((i <= m) && (j <= right))
{
if(c[i].end<=c[j].end)
d[k++] = c[i++];
else
d[k++] = c[j++];
}
if(i > m)
for(int q = j; q <= right; q++)
{
d[k++] = c[q];
}
else
{
for(int q = i; q <= m; q++)
{
d[k++] = c[q];
}
}
}
void mergePass(activity a[], activity b[], int s, int len)
{
int i = 0;
while(i <= len - 2 * s)
{
merge(a, b, i, i + s - 1, i + 2 * s - 1);
i = i + 2 * s;
}
if(i + s < len)
{
merge(a, b, i, i + s - 1, len - 1);
}
else
{
for(int j = i; j < len; j++)
{
b[j] = a[j];
}
}
}
void mergeSort(activity act1[], int len)
{
activity act2[len];
int s = 1;
while(s < len)
{
mergePass(act1, act2, s, len);
s += s;
mergePass(act2, act1, s, len);
s += s;
}
}
void printAll(activity act[], int n)
{
for(int i = 1; i <= n; i++)
{
printf("第%d个活动为%d,时间是:%d ———— %d\n", i, act[i].id, act[i].start, act[i].end);
}
}
void printSelected(activity act[], int n)
{
for(int i = 1, j = 1; i <= n; i++)
{
if(act[i].YorN)
printf("第%d个被选择的活动为%d,时间是:%d ———— %d\n", j++, act[i].id, act[i].start, act[i].end);
}
}
int greedySelector(activity ACT[], int n){
ACT[1].YorN= 1;
int j = 1, count = 1;
for(int i = 2; i <= n; i++){
if(ACT[i].start >= ACT[j].end){
ACT[i].YorN = 1;
j = i;
count++;
}
}
return count;
}
int main()
{
int n;
printf("请输入活动个数:");
scanf("%d", &n);
activity ACT[n+1];
ACT[0].id = ACT[0].start = ACT[0].end = 0;
for(int i = 1; i <= n; i++)
{
printf("请输入第%d个活动的开始时间和结束时间:", i);
scanf("%d %d", &ACT[i].start, &ACT[i].end);
ACT[i].id = i;
ACT[i].YorN = 0;
}
// 按照结束时间非降序排列活动
mergeSort(ACT, n+1);
printAll(ACT, n);
printf("\n总共有%d个活动被选择\n", greedySelector(ACT, n));
printSelected(ACT, n);
return 0;
}
Java:
背包问题:
import java.util.Scanner;
public class Package {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("请输入背包容量:");
float c = s.nextFloat();
System.out.print("请输入物品数量:");
int n = s.nextInt();
float[] w = new float[n];
float[] v = new float[n];
float[] x = new float[n];
for (int i = 0; i < n; i++) {
System.out.print("请输入第" + (i+1) + "件物品的重量和价值:");
w[i] = s.nextFloat();
v[i] = s.nextFloat();
}
System.out.println("最大价值为:" + knapsack(c, w, v, x));
}
public static float knapsack(float c, float[] w, float [] v,float[] x){
int n = v.length;
Element[] d = new Element[n];
for (int i = 0; i < n; i++) {
d[i] = new Element(w[i], v[i], i);
}
mergeSort(d);
int i;
float opt = 0;
for (i = 0; i < n; i++) {
x[i] = 0;
}
for (i = 0; i < n; i++) {
if(d[i].w > c){
break;
}
x[d[i].id] = 1;
opt += d[i].v;
c -= d[i].w;
}
if(i < n){
x[d[i].id] = c / d[i].w;
opt += x[d[i].id] * d[i].v;
}
return opt;
}
//归并排序
static void merge(Comparable c[], Comparable d[], int l, int m, int r) {
int i = l, j = m + 1, k = l;
while ((i <= m) && (j <= r)) {
if (c[i].compareTo(c[j]) >= 0)
d[k++] = c[i++];
else
d[k++] = c[j++];
}
if (i > m)
for (int q = j; q <= r; q++) {
d[k++] = c[q];
}
else {
for (int q = i; q <= m; q++) {
d[k++] = c[q];
}
}
}
static void mergePass(Comparable a[], Comparable b[], int s, int len) {
int i = 0;
while (i <= len - 2 * s) {
merge(a, b, i, i + s - 1, i + 2 * s - 1);
i = i + 2 * s;
}
if (i + s < len) {
merge(a, b, i, i + s - 1, len - 1);
} else {
for (int j = i; j < len; j++) {
b[j] = a[j];
}
}
}
static void mergeSort(Comparable a[]) {
int len = a.length;
Comparable[] b = new Comparable[len];
int s = 1;
while (s < len) {
mergePass(a, b, s, len);
s += s;
mergePass(b, a, s, len);
s += s;
}
}
}
class Element implements Comparable{
int id;
float w;
float v;
public Element(){
}
public Element( float w, float v, int id) {
this.id = id;
this.w = w;
this.v = v;
}
@Override
public int compareTo(Object o) {
if((this.v / this.w) < (((Element)o).v / ((Element)o).w)){
return -1;
}else if((this.v / this.w) == (((Element)o).v / ((Element)o).w)){
return 0;
}else
return 1;
}
@Override
public String toString() {
return "Element{" +
"id=" + id +
", w=" + w +
", v=" + v +
'}';
}
}
qq:1351006594