题解–01背包
题意:有 N (1 ≤ N ≤ 3,402)个物品, i代表第i个物品,其重量为Wi (1 ≤ Wi ≤ 400), 价值为Di (1 ≤ Di ≤ 100), 每个物品最多只能被使用一次。 背包的最大承重为M (1 ≤ M ≤ 12,880).请问在背包承重范围内,挑选物品,拿到的最大价值是多少?
输入:第一行: 两个用空格分开的整数,分别代表物品总个数N 和背包最大承重 M
第2行至第 N + 1 行: 两个用空格分开的整数,分别代表物品 i的重量 Wi 和价值 Di
输出:输出一个整数,代表在背包承重范围,挑选物品, 能取得的最大价值
思路:遍历每一种商品,遍历背包大小(从大到小),max选取,答案存在dp[m]里。
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,w[3410],d[3410],dp[12885];
int main(){
memset(dp,0,sizeof(dp));//初始化
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>w[i]>>d[i];
}
for(int i=1;i<=n;i++){
for(int j=m;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+d[i]);
}
}
cout<<dp[m]<<endl;
return 0;
}