目录
时间限制: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<iostream>
#include<iomanip>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,dp[105][1005],w[105],c[105];
int main(){
cin>>m>>n;
for(int x=1;x<=n;x++){
cin>>w[x]>>c[x];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=0;k*w[i]<=j;k++){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-k*w[i]]+c[i]*k);
}
}
}
cout<<"max="<<dp[n][m];
return 0;
}