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
原文地址:https://www.cnblogs.com/zjsyzmx0527/p/9897034.html