背包问题

Posted howbin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了背包问题相关的知识,希望对你有一定的参考价值。

背包问题

问题描述
技术分享图片

二 问题分析
技术分享图片
**三 代码实现

        package knapsnap;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;

public class bin
{
    public static void main(String[] args) throws IOException
    {
        int []w= {0,10,20,30}; 
        int []v= {0,60,100,120}; 
        int c=50;
        element []ele=new element[w.length-1] ;
        for(int i=1; i<w.length; i++)
        {
        	ele[i-1]=new element(w[i],v[i],i);
        }
        greedyLoading myGreedyLoading=new greedyLoading(ele, c);

    }
}
class element   //集装箱类
{
    float w;   //重量   
    float v;   //价值
    int i;     //编号
    float x=0;   //是否上船
    public element(int w,int v, int i)
    {
        this.w=w;
        this.v=v;
        this.i=i;
    }
}
class greedyLoading
{
    element []ele;
    float c;            //船的容量
    float rc;           //剩余载重量
    float optv=0;       //最优价值
    float optw=0;       //最优载重
    public greedyLoading(element []ele,int c) throws IOException
    {
        this.ele=ele;
        this.c=c;
        this.rc=c;
        GreedyLoading();
        display();
    }
    public void GreedyLoading()
    {
    	Arrays.sort(ele, new Comparator<element>(){
            //传入的时候由用户自己选
            @Override
            public int compare(element o1, element o2) {
                // TODO Auto-generated method stub
                float finsh1 = o1.v/o1.w;
                float finsh2 = o2.v/o2.w;
                if (finsh1>finsh2)
                {
                	return -1;
                }
                else
                {
                	if (finsh1<finsh2)
                    {
                    	return 1;
                    }else 
                    {
                    	return 0;
                    }
             
                }
                
            }
        });
    	int i;
    	for(i=0; i<ele.length; i++)
    	{
    		if(ele[i].w<=rc)
    		{
    			ele[i].x=1;  //安排
    			rc-=ele[i].w;
    			optw+=ele[i].w;
    			optv+=ele[i].v;
    		}
    		else 
    		{
    			break;
    		}
    	}
    	if(i<ele.length)
    	{
    		ele[i].x=rc/ele[i].w;
    		optw+=ele[i].w*ele[i].x;
            optv+=ele[i].v*ele[i].x;
    		rc-=ele[i].w*ele[i].x;
    	}
    }
    public void display() throws IOException
    {
    	BufferedWriter fout=new BufferedWriter(new FileWriter("out.txt"));
    	fout.write("c="+c);
        fout.newLine();
        fout.write("rc="+rc);
        fout.newLine();
        fout.write("optw="+optw);
        fout.newLine();
        fout.write("optv="+optv);
        fout.newLine();
        for(int i=0; i<ele.length; i++)
        {
            fout.write("ele["+i+"]:");
            fout.newLine();
            fout.write("i:	"+ele[i].i);
            fout.newLine();
            fout.write("w:	"+ele[i].w);
            fout.newLine();
            fout.write("v:	"+ele[i].v);
            fout.newLine();
            fout.write("x:	"+ele[i].x);
            fout.newLine();
            fout.write("+++++++++++++++++++");
            fout.newLine();
        }
        fout.flush();
    }
}



四 运行结果
技术分享图片

五 总结收获

  1. 练习手速

六 不足

  1. 手速较慢




以上是关于背包问题的主要内容,如果未能解决你的问题,请参考以下文章

使用喷气背包导航将自定义过渡动画添加到底部导航设置

在片段的后按防止使用导航图调用前一个片段的 onViewCreated

Android Jetpack 导航禁用滚动位置

0-1背包问题的回溯法代码

c语言背包问题,求高手解答

动态规划_01背包_完全背包_多重背包_分组背包