SSL_1376【彻底背包】

彻底背包

题目

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

输入

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

输出

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

Sample Input

12 4 
2  1 
3  3 
4  5 
7  9

Sample Output

15

彻底背包相比01背包惟一的差距就在程序中的c[i][j]=max(c[i-1][j],c[i][j-a[i]]+b[i]);
除了这个差距,其余跟SSL_1045【采药】彻底同样
只不过最大值取的时候不是从没有这一个物品的一行取,而是从拥有这一个物品的本行取。
上代码!spa

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