1.【活动安排问题】设有n个活动的集合E={1,2,...n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和fi,且si
其实主要关注的点就是前一个活动的结束时间大不大于后一个的开始时间,不大于就把后一个活动加入进去,活动1是直接加入的。
package shiyan.si;
import java.util.Scanner;
public class Huodong {
// 贪心算法1
public static int greedselect(int[] a, int[] b, int n){
int i,j=0,cnt=1;//活动1直接加入
System.out.println("活动1进行("+a[0]+","+b[0]+")");
for(i=1;ib[j]){ //如果当前的开始时间大于上一个的结束时间,则加入到活动中
System.out.println("活动"+(i+1)+"进行("+a[i]+","+b[i]+")");
cnt++;
j=i;
}
}
return cnt;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.print("输入活动的数目:");
int max=scanner.nextInt();
int k,cont;
int a[]=new int[max];
int b[]=new int[max];
for(k=0;k
2.【背包问题】列有一堆物品S=(a1,a2…an),每一个物品ai都有对应的重量wi和价值vi。现在有一个背包,容量为C。现在要选择物品装入背包,所选物品重量不能超过背包容量,并使得背包里物品价值最大。与0-1背包不同的是,可以对物品进行分割,即可以只选取物品ai的一部分装入背包。
考虑的越多,越复杂,目前就这样简单实现吧。
package shiyan.si;
import java.util.Scanner;
public class T01bag {
private static int ai;
private static int C;
private static int t;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入物品数量");
ai=scanner.nextInt();
int v[]=new int[ai];
int w[]=new int[ai];
System.out.println("请输入背包的容积");
C=scanner.nextInt();
for (int i = 0; i < ai; i++) {
System.out.println("请输入对应物品" + (i + 1) + "的体积和价值");
v[i]=scanner.nextInt();
w[i]=scanner.nextInt();
}
double sum=max(ai,C,v,w);
System.out.println("背包的总价值为:" + sum);
}
public static double max(int ai,int c,int v[],int w[]){
double s[]=new double[ai];
double sum=0;
for (int i = 0; i < ai; i++) {
s[i] = costeffective(v[i], w[i]);
}
for (int j=0;j
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)