zoukankan      html  css  js  c++  java
  • 01背包问题,动态规划

    /*
    w代表物品重量,v代表物品价值,c代表背包最大能容纳重量
    res[i][j]代表背包可以选择前i个物品,最大容量为j时候的最大价值
    
    			  res[i-1][j]   									if(w[i-1] > j)
    res[i][j]  = 
    			  max((res[i-1][j-w[i-1]]+v[i-1]), res[i-1][j])     else
    **/
    public class Package01
    {
    	public int[][] getMaxValue(int[] w, int[] v, int c)
    	{
    		int n = w.length;
    		int[][] res = new int[n+1][c+1];
    		
    		for(int i = 0; i < n+1; i ++)
    		{
    			res[i][0] = 0;
    		}
    		for(int j = 0; j < c+1; j ++)
    		{
    			res[0][j] = 0;
    		}
    		
    		for(int i = 1; i < n+1; i ++)
    		{
    			for(int j = 1; j < c+1; j++)
    			{
    				if(w[i-1] > j)
    				{
    					res[i][j] = res[i-1][j];
    				}
    				else
    				{
    					res[i][j] = Math.max((res[i-1][j-w[i-1]]+v[i-1]), res[i-1][j]);
    				}
    			}
    		}
    		
    		return res;
    	}
    	//反向找出选出的背包
    	public int[] select(int[][] res, int[] w, int c)
    	{
    		int n = w.length;
    		int[] x = new int[n];
    		int j = c;
    		for(int i = n; i > 0; i --)
    		{
    			if(res[i][c] > res[i-1][j])
    			{
    				x[i-1] = 1;
    				j -= w[i-1];
    			}
    		}
    		return x;
    	}
    	
    	public static void main(String[] args)
    	{
    		int[] w = {2,3,4,5};
    		int[] v = {3,4,5,7};
    		int c = 10;
    		Package01 p = new Package01();
    		int[][] res = p.getMaxValue(w, v, c);
    		int[] x = p.select(res, w, c);
    		for (int i : x) 
    		{
    			System.out.print(i + " ");
    		}
    	}
    }
    
  • 相关阅读:
    岁月
    唯美励志古风
    活着
    走进华夏统一
    使用Fiddler测试WebApi接口
    深入了解正则表达式
    Linux 学习_ssh(secure shell)
    PHP使用mysql扩展操作数据库
    给自己的网站加点情趣,常用的javaScript效果
    三层架构的基础知识
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5808396.html
Copyright © 2011-2022 走看看