CodeForces 106C 【DP】

本文介绍了一种通过动态规划解决商品交换问题的算法,旨在利用有限的资源通过一系列转换获取最大价值。具体实现中,使用了多轮遍历和状态转移方程来更新最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:
n g dough  m种商品?
每种有ai stuffing, 拿bi stuffing + ci dough -> di tugriks
rest c0 dough -> d0 tugriks
求最大的tugriks
思路:
dough是爸爸,
dp[i] 代表 在花费 i 情况下 前 j 个 商品的最大。

枚举在 k g dough 下的各种收入情况,取最大;

大致分成两个部分,用ai + bi 获得的钱,剩下的dough去干嘛得到。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

int dp[1010];
int m,n,cc0,dd0;
int a[15],b[15],c[15],d[15];

int main()
{
    cin>>n>>m>>cc0>>dd0;
    for(int i=0;i<m;i++)
        cin>>a[i]>>b[i]>>c[i]>>d[i];
    memset(dp,0,sizeof(dp));
    for(int i=0;i<m;i++)
    {
        for(int k=n;k>=c[i];k--)
        {
            int p=0,q=0,num=0;
            for(;p<=a[i]&&q<=k;p+=b[i],q+=c[i],num++)
            {
                int come1=num*d[i]+dp[k-num*c[i]];
                int come2=num*d[i]+(k-num*c[i])/cc0*dd0+dp[k-num*c[i]-(k-num*c[i])/cc0*cc0];
                int come3=k/cc0*dd0+dp[k-k/cc0*cc0];
                int come4=dp[k-k%cc0];
                dp[k]=max(dp[k],come1);
                dp[k]=max(dp[k],come2);
                dp[k]=max(dp[k],come3);
                dp[k]=max(dp[k],come4);
            }
        }
    }
    printf("%d\n",dp[n]);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值