0-1背包问题
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 }