zoukankan      html  css  js  c++  java
  • [USACO3.4] Raucous Rockers

    (n) 个物品依次出现,你需要把它们依次装进 (m) 个包。第 (i) 个包中装的物品的出现次序必须都在第 (i-1) 个包之后。物品可以放弃。物品有体积,包有容量 (t)。求可以装的物品的最大数目。(n,m,t leq 20)

    Solution

    (f[i][j][k]) 表示考虑了前 (i) 个物品,正在装第 (j) 个包,这个包被装了 (k) 体积时的最大收益

    转移无非就是考虑换一个新的包,决策装不装这个物品

    #include <bits/stdc++.h>
    using namespace std;
    
    int n,t,m,f[25][25][25],a[25];
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n>>t>>m;
        for(int i=1;i<=n;i++) cin>>a[i];
        int ans=0;
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=m;j++) {
                for(int k=0;k<a[i];k++) f[i][j][k]=f[i-1][j][k];
                for(int k=a[i];k<=t;k++) {
                    f[i][j][k]=max(f[i-1][j][k],max(f[i-1][j-1][t],f[i-1][j][k-a[i]])+1);
                    ans=max(ans,f[i][j][k]);
                }
            }
        }
        cout<<ans;
    }
    
    
  • 相关阅读:
    用户交互语句
    基础数据类型补充与总结
    Python 中表示 False 的方法
    集合
    字典
    元组
    列表
    整型数据详述和进制转换
    f-strings 详解
    字符串方法详解
  • 原文地址:https://www.cnblogs.com/mollnn/p/12508724.html
Copyright © 2011-2022 走看看