暑期个人赛--第二场--B

来源:互联网 发布:南笙 知乎 编辑:程序博客网 时间:2024/06/05 03:49

时间限制 1000 ms 内存限制 65536 KB

题目描述

丁神又要去Google上班了,这一次丁神想多做几道水题,并使题目的总水量最大.丁神同一时刻只能在水一道题,只有做完这道题才能得到它的水值,丁神的总时间为t,现在一共有n道题,编号从1到n,每道题有两个值aba为做这道题需要的时间,b为题目的水值。

输入格式

输入第一行为数据组数T(T10),接下来T组数据,每组数据中第一行为两个数tnn为题目的数量,t为总时间,接下来n行,每行两个正整数ab(1a,t10001n1001b1000000000)

输出格式

对于每组数据,输出对应的最大总水量,每个输出占一行。

输入样例

110 28 166 12

输出样例

16

赛中提交:WA WA WA AC


题目大意:简单的背包DP


思路:

背包dp


WA原因和反省:

(1)dp数组的第二个下标开得太小,原来只开了106,而t(背包容量)的范围是1000

开成了1006就过了

(2)另外就是long long的问题,数据很大最大是1e10,因为还要一直加和,所以必须要开int



下面是AC代码

#include <iostream>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string>#include <vector>#include <list>#include <map>#include <queue>#include <stack>#include <bitset>#include <algorithm>#include <numeric>#include <functional>#define maxn 100005 using namespace std;typedef long long ll; int v[106],w[106];ll dp[106][1006]; int main(){    int T;    scanf("%d",&T);    while(T--){        int n,t;        memset(dp,0,sizeof(dp));        scanf("%d %d",&t,&n);        for(int i=0;i<n;i+=1){            scanf("%d %d",&w[i],&v[i]);        }         for(int i=0;i<n;i+=1){            for(int j=0;j<=t;j+=1){                if(j<w[i]){                    dp[i+1][j]=dp[i][j];                }                else{                    dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);                }            }        }         printf("%lld\n",dp[n][t]);    }    return 0;}


0 0
原创粉丝点击