完全背包(二维数组)


Description

设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。

Input

第一行:两个整数,M(背包容量,M<= 200)和N(物品数量,N<= 30); 第2…N+1 行:每行二个整数Wi,Ui,表示每个物品的重量和价值。

Output

仅一行,一个数,表示最大总价值。

Sample Input

12 4 
2  1 
3  3 
4  5 
7  9 

Sample Output

15

解题思路

这道题的思路其实就是跟上一题完全背包一样,只不过把一维数组改成了二维。

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,w[1001],p[1001],f[1001][1001],maxn=0;
int main()
{
   
    cin>>n>>m;
    for(int i=1;i<=m;i++)
	 cin>>w[i]>>p[i];
    for(int i=1;i<=m;i++)
    {
   
        for(int j=1;j<=n;j++)
        {
   
            if(j>=w[i]) 
			 f[i][j]=max(f[i-1][j],f[i][j-w[i]]+p[i]);
            else 
			 f[i][j]=f[i-1][j];
        }
    }
    for(int i=1;i<=m;i++)
     for(int j=1;j<=n;j++)
	  maxn=max(f[i][j],maxn);
    cout<<maxn;
    return 0;
}