题目
有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。
第 i 种物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
 输出最大价值。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤1000
 0<vi,wi≤1000
- 输入样例
4 5
1 2
2 4
3 4
4 5
- 输出样例:
10
题解
import java.util.Scanner;
/**
 * @author akuya
 * @create 2023-07-23-12:11
 */
public class entirelyBag {
    static int N=1010;
    static int w[]=new int [N];
    static int v[]=new int [N];
    static int n,m;
    static int f[][]=new int[N][N];
    static int f2[]=new int[N];
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        n=scanner.nextInt();
        m=scanner.nextInt();
        for(int i=1;i<=n;i++) {
            v[i] = scanner.nextInt();
            w[i] = scanner.nextInt();
        }
        //标准代码
        for(int i=1;i<=n;i++){
            for(int j=0;j<=m;j++){
                f[i][j]=f[i-1][j];
                if(j>=v[i])f[i][j]=Math.max(f[i][j],f[i][j-v[i]]+w[i]);
            }
        }
//        //滚动数组
//        for(int i=1;i<=n;i++){
//            for(int j=v[i];j<=m;j++)
//                f2[j]=Math.max(f2[j],f2[j-v[i]]+w[i]);
//        }
        
        //System.out.println(f[n][m]);
        System.out.println(f[n][m]);
    }
}
思路
本题和01背包的区别在于能拿几件物品。又公式可以推到
f[i , j ] = max( f[i-1,j] , f[i-1,j-v]+w ,  f[i-1,j-2*v]+2*w , f[i-1,j-3*v]+3*w , .....)
f[i , j-v]= max(            f[i-1,j-v]   ,  f[i-1,j-2*v] + w , f[i-1,j-3*v]+2*w , .....)
由上两式,可得出如下递推关系: 
                        f[i][j]=max(f[i,j-v]+w , f[i-1][j]) 
于是在01背包的代码基础上稍微修改即可。
思路图如下
 

















![[C语言刷题]杨氏矩阵、返回型参数](https://img-blog.csdnimg.cn/bc40965cdd7b4603be52e8062f82d622.png)

