• 01背包问题


    Source

    https://buaacoding.cn/contest-ng/index.html#/269/problems

    Description

    题目描述

    虽然零崎已经有了补番目录,然而零崎发现就算是假期,他也有各(da)种(ma)各(jiang)样的事情要做,所以零崎现在要在有限的时间内尽量补完更有价值看的视频。

    零崎的假期一共有T时间,现在有k个视频,每个视频的价值为v,时间长度为t,零崎会好好看完不会随意快进。

    输入

    多组测试数据。

    每组数据第一行为两个整数T和k,表示总时间和视频数量。

    接下来k行,每行两个数据vi,ti代表第i个视频的价值和时长。

    1<=T<=20000,1<=k<=300,1<=v,t<=200

    输出

    对于每组数据,输出一行,为零崎能看完的视频的价值总和的最大值。

    输入样例

    6 3
    1 2
    2 3
    3 2
    2 4
    3 1
    2 1
    1 3
    1 5

    输出样例

    5
    5

    code

    二维数组做法,空间复杂度为O(Tk)级别,会MLE。

     1 #include<stdio.h>
     2 #define M 301
     3 #define N 20001
     4 int Max(int a,int b);
     5 int val[M],t[M],f[M][N];//int f[M][N]:k-视频个数-行数;T-总时长-列数
     6 int main()
     7 {
     8     int T,k;
     9 
    10     while(scanf("%d%d",&T,&k) == 2){
    11         int i,j;
    12         for(i = 1;i <= k;i++)
    13             scanf("%d%d",&val[i],&t[i]);
    14         for(j = 0;j <= T;j++)
    15             f[0][j] = 0;
    16         for(i = 1;i <= k;i++){
    17             for(j = 0;j <= T;j++){
    18                 if(t[i] > j)
    19                     f[i][j] = f[i-1][j];
    20                 else
    21                     f[i][j] = Max(f[i-1][j],f[i-1][j-t[i]]+val[i]);
    22             }
    23         }
    24         printf("%d\n",f[k][T]);
    25     }
    26 }
    27 
    28 int Max(int a,int b)
    29 {
    30     if(a > b)
    31         return a;
    32     else
    33         return b;
    34 }
    C-MLE
  • 相关阅读:
    判断一棵二叉树是否为二叉搜索树
    分离链接法的删除操作函数
    线性探测法的查找函数
    Bzoj1251 序列终结者
    POJ2396 Budget
    Bzoj3531: [Sdoi2014]旅行
    Codeforces Round #389 Div.2 E. Santa Claus and Tangerines
    Codeforces Round #389 Div.2 D. Santa Claus and a Palindrome
    Codeforces Round #389 Div.2 C. Santa Claus and Robot
    Codeforces Round #389 Div.2 B. Santa Claus and Keyboard Check
  • 原文地址:https://www.cnblogs.com/zjsyzmx0527/p/9897034.html
Copyright © 2020-2023  润新知