动态规划-01背包问题

时间:2022-01-01 15:08:09

【题目名称】0/1背包

一个旅行者有一个最多能装m公斤物品的背包,现在有n件物品,它们的重量分别是w1,w2,…,wn,它们的价值分别为c1,c2,…,cn。若每一种物品只有一件,求旅行者能获得的最大总价值。

【输入格式】
第一行:两个整数,m(背包容量,m<=200)和n(物品数量,n<=30)。

第二~n+1行:每行两个整数wi,ci,表示每个物品的重量和价值

【输出格式】
一个数据,表示最大总价值

【输入样例#1】

10 4

2 1

3 3

4 5

7 9

【输出样例#1】

12

import java.util.*;
public class Main {  
	static int m,n;
	static int w[]=new int[30];
	static int v[]=new int[30];
	static int f[][]=new int[30][200];
	public static int max(int x,int y){        //求x和y的最大值

	    if(x>y)

	       return x;

	    else

	       return y;

	}
    public static void main(String[] args) {  
    	Scanner in=new Scanner(System.in);
    	m=in.nextInt();
    	n=in.nextInt();
    	for(int i=1;i<=n;i++)
    	{
    		w[i]=in.nextInt();
    		v[i]=in.nextInt();
    	}
    	
        for(int i=1;i<=n;i++){     //f(i,x)表示前i件物品,总重量不超过x的最优价值

            for(int x=1;x<=m;x++){

               if(x>=w[i])

                   f[i][x]=max(f[i-1][x-w[i]]+v[i],f[i-1][x]);

               else f[i][x]=f[i-1][x];

            }

         }
        System.out.println(f[n][m]);
    }  
    

  
}