1 条题解

  • 0
    @ 2025-8-24 21:40:59

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar DayC
    **

    搬运于2025-08-24 21:40:59,当前版本为作者最后更新于2018-01-13 22:20:27,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    此题为一道二维费用背包题。(若是不规定“必须按照创作的时间顺序在所有的CD盘上出现”,就是一道排序水题)

    与裸的二维费用不同,此题不同点在于状态转移方程。

    此题的状态转移方程为:

    *F[m][t]=max{
        f[m][t]//不选当前歌曲
        f[m-1][T]+1//用一张新的CD来存当前歌曲(m张CD不够存的情况)
        f[m][t-time[i]]+1//一张CD放多首歌曲
    }*
    

    F[m][t]表示用m张CD,最后一张CD用t分钟所能存的最大歌曲数 time[i]表示第i首哥的时间

        #include<iostream>
        #include<cstring>
        #include<iostream>
        #define maxn 21
        using namespace std;
        int N,T,M;
        int f[maxn][maxn];//用于保存状态
        int t[maxn];
        int max(int i,int j,int k){
            i=max(i,j);
            i=max(i,k);
            return i;
        }
        int main(){
            cin>>N>>T>>M;
            for(int i=1;i<=N;i++){
                cin>>t[i];
            }
            for(int i=0;i<=T;i++){//初始化数组
                f[0][i]=0;
            }
            for(int i=1;i<=N;i++){
                for(int m=M;m>=1;m--){//注意:因为是01背包,所以要从后往前更新状态
                    for(int j=T;j>=t[i];j--){
                        f[m][j]=max(f[m][j],f[m-1][T]+1,f[m][j-t[i]]+1);//状态转移
                    }
                }
            }
            cout<<f[M][T];
        }
    
    
    • 1

    [USACO3.4] “破锣摇滚”乐队 Raucous Rockers

    信息

    ID
    1765
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者