zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    基于webpack的react脚手架
    关于密码的简单加密
    移动端日期控件
    JS中如何巧妙的用事件委托
    JS中关于正则的巧妙操作
    call,apply,bind
    vue常用笔记
    高性能的js第三方库——lodash、 Underscore、async、md5及moment
    Nightwatch——自动化测试(端对端e2e)
    for循环的耗时问题
  • 原文地址:https://www.cnblogs.com/zjsyzmx0527/p/9897034.html
Copyright © 2011-2022 走看看