设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n 种物品中选取若干件(同一种物品能够屡次选取),使其重量的和小于等于M,而价值的和为最大。ios
第一行:两个整数,M(背包容量,M<= 200)和N(物品数量,N<= 30); 第2…N+1 行:每行二个整数Wi,Ui,表示每一个物品的重量和价值。web
仅一行,一个数,表示最大总价值。svg
12 4 2 1 3 3 4 5 7 9
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; }