题目大意
有N件物品和一个容量为M的背包。第i件物品的重量是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。(1 ≤ N ≤ 3,402,1 ≤ M ≤ 12,880,1 ≤ Wi ≤ 400,1 ≤ Di ≤ 100)
这题显然是一个0-1背包,然后~~就没有然后了。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=20000;
int a[N],b[N],s[N];
int main(){
int m,n,i,j;
cin>>n>>m;
for(i=1;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
for(i=1;i<=n;i++)
for(j=m;j>=a[i];j--)
if(s[j]<s[j-a[i]]+b[i])
s[j]=s[j-a[i]]+b[i];
cout<<s[m];
return 0;
}
P.S.我才不会告诉你这题是P1048采药的升级版呢