程序如下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