【洛谷P2623物品选取】动态规划

本文深入探讨了背包问题的高效解决策略,通过三种不同类型的背包操作:完全背包、多重背包和01背包,展示了如何使用动态规划算法进行优化求解。代码中详细解释了每种背包类型的具体实现方式,包括状态转移方程和边界条件设定。

分析

各种背包弄在一起。

AC代码

// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
#define ms(a,b) memset(a,b,sizeof(a))
typedef long long ll;
int f[2005];
int n,m;
inline int read() {
    int x=0,w=0; char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return w?-x:x;
}
inline void write(int x) {
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
}
int main(int argc,char* argv[]) {
    std::ios::sync_with_stdio(false);
    n=read(),m=read();
    while (n--) {
        int opt=read(),a,b,c;
        switch (opt) {
            case 1:
                a=read(),b=read();
                for (int i=m;i;i--)
                    for (int j=1;j<=i;j++) 
                        f[i]=max(f[i],f[i-j]+j*j*a-b*j);
                break;
            case 2:
                a=read(),b=read(),c=read();
                for (int i=m;i>=b;i--) 
                    for (int j=1;j<=min(c,i/b);j++) 
                        f[i]=max(f[i],f[i-j*b]+j*a);
                break;
            case 3:
                a=read(),b=read();
                for (int i=b;i<=m;i++) f[i]=max(f[i],f[i-b]+a);
                break;
        }
    }
    write(f[m]); puts("");
    return 0;
}

转载于:https://www.cnblogs.com/Dawn-Star/p/9839562.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值