目录
【G题-寒假购物】
链接:https://ac.nowcoder.com/acm/contest/10636/G
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
众所周知放假早的学校,早已开始寒假,这一天同学AC带着一个购物车来到超市。
这个购物车很神奇,他装东西只需要考虑体积而不用考虑形状。
这个购物车的容积为v。
这个超市有n种商品,每种的体积为t,价钱为w。
AC想看看这个购物车装到极限 最多能花掉多少钱 。
但是他也不想浪费 所以每个东西只装一件 装不满就算了(商品种类少得可怜)。
输入描述:
第一行两个整数1<=n<=1000,1<=v<=1000 第二至n+2行有两个整数1<=t<=1000,1<=w<=1000
输出描述:
输出一个数字代表花掉的钱
示例1
输入
5 6 1 2 2 4 3 4 4 5 5 6
输出
10
参考:
https://blog.csdn.net/lanyu_01/article/details/79815801
https://blog.csdn.net/qq_40778406/article/details/80581238
题解:
#include<iostream>
using namespace std;
const int N=10010;
int f[N][N];//这个数组表示i,j的最大价值
int v[N],w[N];
int main()
{
int n,x;cin>>n>>x;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=x;j++)//构建一个n行物品行,一个从1-v的体积列
{
//如果不能装的话,继续用i-1行的最大值
f[i][j]=f[i-1][j];
//如果能装的话,那就决策这个背包:(自己的容量当下的最大价值vs自己的容量+减去当下这个物品的重量的最大价值)
if(j>=v[i])//当前背包的体积大于所背容量的体积的话,就表示还有剩余的东西可以装
{
f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
}
}
}
cout<<f[n][x];
return 0;
}