m0_69233734 2023-05-16 12:24 采纳率: 61.9%
浏览 28
已结题

为什么和样列中的输出不一样

package Sjfx;

import java.util.Arrays;
import java.util.Scanner;

public class Beibao {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("物品数:");
    int n = sc.nextInt();
    float[] w = new float[n];
    float[] v = new float[n];
    float[] x = new float[n];

    System.out.println("背包容量:");
    float c = sc.nextFloat();

    System.out.println("每个物品重量:");
    for (int i = 0; i < n; i++) {
        w[i] = sc.nextFloat();
    }

    System.out.println("每个物品价值:");
    for (int i = 0; i < n; i++) {
        v[i] = sc.nextFloat();
    }

    float opt = knapsack(c, w, v, x);
    System.out.println("最大价值:" + opt);
}
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);
    Arrays.sort(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) // d[i].w表示扫描到第i个物品时取出其重量
            break; // 物品i装不下时跳出
        x[d[i].i] = 1; // 物品i装入背包
        opt += d[i].v;
        c -= d[i].w; // 背包当前容量
    }
    if (i < n) { // 背包未装满还有剩余物品时
        x[d[i].i] = c / d[i].w; // 装入部分物品i
        opt += x[d[i].i] * d[i].v;
    }
    System.out.print("此时包中装了");
    for (int j = 0; j < n; j++) {
        if (x[j] != 0) {
            System.out.print("第" + (j + 1) + "件和" + x[j] + "的");
        }
    }
    System.out.println("");
    return opt;
}
public static class Element implements Comparable<Beibao.Element> {
    float v;
    float w;
    int i;


    public Element(float w, float v, int i) {
        this.w = w;
        this.v=v;
        this.i = i;
    }
    @Override
    public int compareTo(Beibao.Element o) {
        if (this.w < o.w)
            return -1;
        else if (this.w == o.w)
            return 0;
        else
            return 1;
    }
}

}

img

img

  • 写回答

4条回答 默认 最新

  • AllenGd 大数据领域优质创作者 2023-05-16 13:13
    关注
    
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Beibao {
        public static void main(String[] args) {
            try (Scanner sc = new Scanner(System.in)) {
                System.out.println("物品数:");
                int n = sc.nextInt();
                float[] w = new float[n];
                float[] v = new float[n];
                float[] x = new float[n];
    
                System.out.println("背包容量:");
                float c = sc.nextFloat();
    
                System.out.println("每个物品重量:");
                for (int i = 0; i < n; i++) {
                    w[i] = sc.nextFloat();
                }
    
                System.out.println("每个物品价值:");
                for (int i = 0; i < n; i++) {
                    v[i] = sc.nextFloat();
                }
    
                float opt = knapsack(c, w, v, x);
                System.out.println("最大价值:" + opt);
            }
        }
    
        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);
            quickSort(d, 0, n - 1); // 物品按照单位价值排序
            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) // d[i].w表示扫描到第i个物品时取出其重量
                    break; // 物品i装不下时跳出
                x[d[i].i] = 1; // 物品i装入背包
                opt += d[i].v;
                c -= d[i].w; // 背包当前容量
            }
            if (i < n) { // 背包未装满还有剩余物品时
                x[d[i].i] = c / d[i].w; // 装入部分物品i
                opt += x[d[i].i] * d[i].v;
            }
            System.out.print("此时包中装了");
            for (int j = 0; j < n; j++) {
                if (x[j] != 0) {
                    System.out.print("第" + (j + 1) + "件的" + x[j] + "和");
                }
            }
            System.out.println("");
            return opt;
        }
    
        public static class Element {
            float v; // 物品价值
            float w; // 物品重量
            int i; // 物品编号
    
            public Element(float w, float v, int i) {
                this.w = w;
                this.v = v;
                this.i = i;
            }
        }
    
        public static void quickSort(Element[] d, int left, int right) {
            if (left < right) {
                int i = left, j = right;
                Element x = d[left];
                while (i < j) {
                    while (i < j && d[j].v / d[j].w <= x.v / x.w)
                        j--;
                    if (i < j)
                        d[i++] = d[j];
                    while (i < j && d[i].v / d[i].w > x.v / x.w)
                        i++;
                    if (i < j)
                        d[j--] = d[i];
                }
                d[i] = x;
                quickSort(d, left, i - 1);
                quickSort(d, i + 1, right);
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月24日
  • 已采纳回答 5月16日
  • 创建了问题 5月16日

悬赏问题

  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)
  • ¥20 web页面如何打开Outlook 365的全球离线通讯簿功能
  • ¥15 io.jsonwebtoken.security.Keys
  • ¥15 急,ubuntu安装后no caching mode page found等
  • ¥15 联想交换机NE2580O/NE1064TO安装SONIC