2021.6.25 喜迎寒假多校联赛(赛后复盘)

目录

【G题-寒假购物】

题目描述

输入描述:

输出描述:

输入

输出


【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;
}

猜你喜欢

转载自blog.csdn.net/weixin_46066669/article/details/118939782