题目描述
ZZW神牛想要通过吃东西变得强壮!于是他买了N(1<=N<=4000)件食物,每件食物有自己的体积V(1<=V<=400),以及可以为ZZW增加的强壮度D(1<=D<=100),ZZW的胃只有S(1<=S<=15000)那么大,他要怎么吃才能得到最多的强壮度呢?求可以获得的最大强壮度。
输入
第一行为N和S
后面N行每行有两个数Vi和Di,表示每件食物的体积和可增加的强壮度
输出
输出一个数,可获得的最大强壮度
样例输入 Copy
4 6 1 4 2 6 3 12 2 7
样例输出 Copy
23
分析:二维会爆空间,一维优化。
一维是在二维的原理基础上对空间的优化
#include <iostream>
#include <cstring>
using namespace std;
int main ()
{
int n,s;
cin>>n>>s;
int dp[s+1]; //dp[q]表示 在背包空间为q(q<=s)时前p(p<=n)件商品的最优解
memset(dp,0,sizeof(dp));
int v[n+1];
int d[n+1];
int i,j;
for(i=1;i<=n;i++)
{
cin>>v[i]>>d[i];
}
for(i=1;i<=n;i++) //前i件物品的选取
{
for(j=s;j>=v[i];j--) //背包空间为j时前i件物品的选取
{
dp[j]=max(dp[j],dp[j-v[i]]+d[i]); // 前一个的dp[j]是当前i, 后两个dp[] dp[]
} //不装 //装 //是i-1循环得出的
}
cout<<dp[s];
return 0;
}