[hihocoder]01背包 accept 与 time limit exceed的代码比较

链接:http://hihocoder.com/problemset/problem/1038?sid=469496

accept代码:

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 int dp[501][100001];
 6 int need[501];
 7 int value[501];
 8
 9 int main()
10 {
11     int num,amount;
12     cin>>num>>amount;
13     for(int i=1;i<=num;i++)
14     {
15         cin>>need[i]>>value[i];
16     }
17
18     for(int j=1;j<=num;j++)
19     {
20         for(int i=0;i<=amount;i++)
21         {
22             if(i<need[j])
23             {
24                 dp[j][i]=dp[j-1][i];
25             }
26             else
27             {
28                 dp[j][i]=max(dp[j-1][i],(dp[j-1][i-need[j]]+value[j]));
29             }
30         }
31     }
32
33     cout<<dp[num][amount]<<endl;
34     return 0;
35 }

TLE代码:

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 int dp[100001][501];
 6 int need[501];
 7 int value[501];
 8
 9 int main()
10 {
11     int num,amount;
12     cin>>num>>amount;
13     for(int i=1;i<=num;i++)
14     {
15         cin>>need[i]>>value[i];
16     }
17
18     for(int j=1;j<=num;j++)
19     {
20         for(int i=0;i<=amount;i++)
21         {
22             if(need[j]>i)
23             {
24                 dp[i][j]=dp[i][j-1];
25             }
26             else
27             {
28                 dp[i][j]=max(dp[i][j-1],(dp[i-need[j]][j-1]+value[j]));
29             }
30         }
31     }
32
33     cout<<dp[amount][num]<<endl;
34     return 0;
35 }

两段代码的唯一区别就是二维数组定义的顺序:dp[物品数][背包容量]——dp[背包容量][物品数]。

为什么呢?

时间: 2024-08-29 04:41:20

[hihocoder]01背包 accept 与 time limit exceed的代码比较的相关文章

tyvj 1005 采药 0-1背包 优化的一位数组 dp 代码1

#include <iostream> #include <string.h> using namespace std; int dp[1005], w[105],v[105],T,M; int max(int x,int y) {    return x>y?x:y;   } void  f( ) {   int i,j; for (i=1; i<=M; i++) for (j=T;j>=0; j--) if (j>=w[i]) dp[j]=max(dp[

tyvj 1005 采药 0-1背包 优化的一位数组 dp 代码2

#include <iostream>#include <string.h>using namespace std;int dp[1005], w[105],v[105],T,M;int max(int x,int y){    return x>y?x:y;   }void  f( ){   int i,j;    for (i=1; i<=M; i++)        for (j=T;j>=w[i]; j--)          dp[j]=max(dp[j

tyvj 1005 采药 0-1背包 优化的一位数组 dp 代码3

#include <iostream>#include <string.h>using namespace std;int dp[1005], w,v,T,M;int max(int x,int y){    return x>y?x:y;   }void  f( ){   int i,j;    for (i=1; i<=M; i++)    {   cin>>w>>v;         //直接读进去        for (j=T;j>

51 Nod 1007 正整数分组【类01背包】

1007 正整数分组 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的. Input 第1行:一个数N,N为正整数的数量. 第2 - N+1行,N个正整数. (N <= 100, 所有正整数的和 <= 10000) Output 输出这个最小差 Input示例 5 1 2 3 4 5 Output示例 1 题目链接

HihoCoder - 01\完全背包

HihoCoder上有两道背包问题的problem, http://hihocoder.com/problemset/problem/1038 (01背包) #include <cmath> #include <cstdio> #include <vector> #include <string> #include <iostream> #include <algorithm> #include <unordered_map&g

hihoCoder #1038 : 01背包(板子题)

#1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要need(i)张奖券进行兑换,同时也只能兑换一次,为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其中第i件奖品的评分值为value(i),表示他对这件奖品的喜好值.现在他想知道,凭借他手上的这

hihoCoder week6 01背包

01背包 题目链接 https://hihocoder.com/contest/hiho6/problem/1 #include <bits/stdc++.h> using namespace std; const int N = 500 + 10; int need[N], value[N]; int dp[100000+10]; int main () { int n,V; scanf("%d %d", &n, &V); for(int i=1;i<

hihoCoder - 1038 - 01背包 (经典动态规划问题!!)

#1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要need(i)张奖券进行兑换,同时也只能兑换一次,为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其中第i件奖品的评分值为value(i),表示他对这件奖品的喜好值.现在他想知道,凭借他手上的这

hihocoder(1038,1043) 01背包与完全背包

动态规划是一直感觉比较模糊的东西,虽然大致上知道是什么一回事,但是离灵活应用还差得远,但貌似比赛中动态规划的题出的特别多,这两个经典问题其实只能算是一个学习动态规划很好的模型.不过万事开头难,关键还是得静下心来多练习. 01背包的状态转移式:f(i, j) = max{f(i-1, j), f(i-1, j-need[i])+value[i]} 直接按照上述的状态转移式申请二维数组进行运算,伪代码如下: fori : 1..N f(0,j) = 0 for i : 1..N for j : 0.