蓝沁儿 2022-04-18 17:48 采纳率: 40%
浏览 41

背包0—1问题:for(int j=1……)这个for循环不太懂

package thir;

import java.util.Scanner;

public class beiBao3 {
//给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。
//问应如何选择装入背包的物品,使得装入背包中物品的总价值最大
static int n,c;
static int max = 0;
static int[] w,v;
static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("请输入物品种数n:");
n = in.nextInt();
System.out.println("请输入背包容量c:");
c = in.nextInt();
w = new int[n+1];
v = new int[n+1];
System.out.println("请以“w v”的形式输入物品信息:");
for(int i = 1; i <= n; i++) {
w[i] = in.nextInt();
v[i] = in.nextInt();
}

    /**
     * 对于n种物品,存在2^n个子集(组合方式)
     * 采用二进制10来表示物品是否被选择,k % 2 ==1
     * 比采用数组方便(数组每次都要遍历一遍)
     */
    for(int i = 1; i <=Math.pow(2,n); i++) {
        int k = i;
        int tempw = 0;
        int tempv = 0;
        for(int j = 1; j <= n; j++) {
            if(k % 2 ==1) {
                tempw += w[j];
                tempv += v[j];
            }
            k /= 2;
        }
        if(tempw <= c) {
            if(tempv > max) {
                max = tempv;

            }
        }
    }
    System.out.println("最大value:" + max);
}

}

  • 写回答

1条回答 默认 最新

  • qq_41255683 2022-04-18 20:46
    关注

    外层是第n种组合,内层是这种组合选的物品的。
    先是只看第一个物品是否选择,然后分别在第一个选择的情况下看第二个,再在前面不同组合的情况下看下一个。
    比如i=1和2时是第一个存在和不存在
    i=3,4,5,6时分别是前两个存在,前两个都不存在,第一个存在第二个不存在,第二个存在第一个不存在

    评论

报告相同问题?

问题事件

  • 创建了问题 4月18日

悬赏问题

  • ¥50 C#写的winform项目无法打包发布
  • ¥20 关于#windows#的问题,请各位专家解答!(相关搜索:服务器)
  • ¥30 使用C++实现ATM系统
  • ¥20 求帮,直连能连上oracle12,但是thinkphp6就是报错
  • ¥15 paddleocr运行报错
  • ¥15 怎么用 matlab 设计滞后-超前串联校正网络
  • ¥15 MFC引用C#生成的dll,将dll放置到非exe程序目录,如何操作
  • ¥15 C#创建webservice接口,三方通过多次跳转访问本方服务,获取wsdl文档,wsdl中ip地址为局域网内本机地址而非三方直接访问的地址。
  • ¥15 关于#wireshark#的问题:需要安卓app流量数据集要安卓流量做包序列长度的实验,比如某些流量是在看视频还是在发评论
  • ¥15 Smail语句如何使用判断语句跳过验证卡密界面