01背包问题-动态规划

程序如下java实现:

import java.util.Scanner;    
/** 
 * 01背包问题 
 */  
public class ZeroOnePack
{  
    public static void main(String[] args) 
    {  
        int N;           //背包数目  
        int[] weight;    //单个物品重量  
        int[] value;     //单个物品价值  
        int[][] values ; //存放价值  
        int maxValue;    //最大价值  
        Scanner in=new Scanner(System.in);  
        maxValue=in.nextInt();  
        N=in.nextInt();  
        weight=new int[N+1];  
        value=new int[N+1];  
        values=new int[N+1][maxValue+1];  
        for(int i=1;i<=N;i++)
        {  
            weight[i]=in.nextInt();  
            value[i]=in.nextInt();  
        }  
        for(int i=0;i<=N;i++)  
            values[i][0]=0;  
        for(int i=0;i<=maxValue;i++)  
            values[0][i]=0;  
        /*核心算法*/
        for ( int i = 1; i <= N; i++){  
            for ( int j = 1; j<=maxValue; j++){  
                if(weight[i]>j){  
                    values[i][j]=values[i-1][j];  
                }else {  
                    values[i][j]=Math.max(values[i-1][j-weight[i]]+value[i], values[i-1][j]);  
                }  
            }  
        }  
        /*逆向输出*/
        for(int i=values.length-1;i>0;i--)
        {
        	for(int j=1;j<values[0].length;j++)
        	{
        		if(j==1)
        			System.out.printf("%d",values[i][j]);
        		else
        			System.out.printf("%5d",values[i][j]);
        	}
        	System.out.println();
        }
        System.out.print("最大价值: "+values[N][maxValue]);
        in.close();  
    }  
}  
结果如下:

10 5
2 6
2 3
6 5
5 4
4 6
0    6    6    9    9   12   12   15   15   15
0    6    6    9    9    9   10   11   13   14
0    6    6    9    9    9    9   11   11   14
0    6    6    9    9    9    9    9    9    9
0    6    6    6    6    6    6    6    6    6
最大价值: 15

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值