题意: ...基础背包问题,大概意思是,承重m的背包,有n个物品,第i个物品重w[i],价值p[i],求背包能装入物品的最大价值
把重量设为数组下标 即c[i],i为物品重量,c[i]为背包重i物品的价值
一个公式:c[j]=max(c[j],c[j-w[i]]+p[i]); 意思是,不加上第i个物品时背包的价值,与重量j减去第i个物品重量后背包的价值加上第i个物品的价值比较
不同的是这道题目给的数据范围比较大,用二维的dp数组会超内存,所以我们要空间优化一下。
ac代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=14000;
int v[maxn],w[maxn];
int dp[maxn];
int main() {
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++)
cin>>w[i]>>v[i];
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++) {
for(int j=m; j>=w[i]; j--) {
if(j>=w[i])
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
cout<<dp[m]<<endl;
return 0;
}