题目描述:
设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。
输入格式:
第一行:两个整数,M(背包容量,M<=50000)和N(物品数量,N<=5000);
第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
输出格式:
仅一行,一个数,表示最大总价值。
样例输入:
10 4 2 1 3 3 4 5 7 9
样例输出:
max=12
提示:
规模很大,50000*5000=2亿5,要注意使用贪心优化,把没用物品去除。
时间限制: 1000ms
空间限制: 128MB
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int w,dp[50001]={},n,w1,v1;
cin>>w>>n;
for(int i=1;i<=n;i++){
cin>>w1>>v1;
for(int j=w1;j<=w;j++){
dp[j]=max(dp[j],dp[j-w1]+v1);
}
}
cout<<"max="<<dp[w];
return 0;
}