完全背包问题
时间限制:1秒 内存限制:128M
题目描述
设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。
输入描述
第一行:两个整数,M(背包容量,M≤200)和N(物品数量,N≤30);
第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
输出描述
仅一行,一个数,表示最大总价值。
样例
输入
10 4 2 1 3 3 4 5 7 9
输出
max=12
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<algorithm>
using namespace std;
int w[205],c[205],f[1000][1000];
int main() {
int m, n;
cin >> m >> n;
for (int i=1; i<= n; i++) {
cin>>w[i]>>c[i];
}
for (int i=1; i<=n; i++) {
for (int j = 0; j <= m; j++) {
for(int k=0; k<=j/w[i]; k++) {
if (j >=k*w[i]) {
f[i][j] = max(f[i-1][j], f[i-1][j-k*w[i]] +k*c[i]);
}
}
}
}
cout<<"max="<< f[n][m] ;
return 0;
}