zoukankan      html  css  js  c++  java
  • 紫书动规 例题9-5 UVA

    题目链接:

    https://vjudge.net/problem/UVA-12563

    题意:

    题解:

    01背包
    一直想二维,但是对于第i首,能不能唱只和时间有关,和前i-1首最多唱了多少没有关系,不能从dp[i-1]转移

    唱完了一首歌,以这首歌的结束时间判断是否到了下一首该唱的时间

    dp[j]:=以j为结束时间,最多唱了多少首,注意j一定要倒着枚举,否则就被当前这首歌覆盖了,就是这首歌唱了好几遍【完全背包】

    代码:

    正解:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define MS(a) memset(a,0,sizeof(a))
     5 #define MP make_pair
     6 #define PB push_back
     7 const int INF = 0x3f3f3f3f;
     8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     9 inline ll read(){
    10     ll x=0,f=1;char ch=getchar();
    11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 //////////////////////////////////////////////////////////////////////////
    16 const int maxn = 1e5+10;
    17 
    18 int n,t,a[55];
    19 int dp[180*50+700];
    20 
    21 int main(){
    22     int T = read();
    23     int cas = 0;
    24     while(T--){
    25         n = read(), t = read();
    26         for(int i=1; i<=n; i++)
    27             a[i] = read();
    28         int V = min(t,180*n);
    29         memset(dp,-1,sizeof(dp));
    30         dp[0] = 0;
    31 
    32         for(int i=1; i<=n; i++)
    33             for(int j=V; j>=a[i]; j--)
    34                 if(dp[j-a[i]] >= 0)
    35                     dp[j] = max(dp[j],dp[j-a[i]]+1);
    36 
    37         int ans1 = 0, ans2;
    38         for(int i=0; i<V; i++){
    39             if(dp[i] >= ans1){
    40                 ans1 = dp[i];
    41                 ans2 = i;
    42             }
    43         }
    44         printf("Case %d: %d %d
    ",++cas,ans1+1,ans2+678);
    45     }
    46 
    47     return 0;
    48 }

    二维WA的

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define MS(a) memset(a,0,sizeof(a))
     5 #define MP make_pair
     6 #define PB push_back
     7 const int INF = 0x3f3f3f3f;
     8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     9 inline ll read(){
    10     ll x=0,f=1;char ch=getchar();
    11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 //////////////////////////////////////////////////////////////////////////
    16 const int maxn = 1e5+10;
    17 
    18 int n,t,a[55];
    19 int dp[55][180*50+700];
    20 
    21 int main(){
    22     int T = read();
    23     int cas = 0;
    24     while(T--){
    25         n = read(), t = read();
    26         for(int i=1; i<=n; i++)
    27             a[i] = read();
    28         int V = min(t,180*n);
    29         memset(dp,0,sizeof(dp));
    30         dp[0][0] = 0;
    31 
    32         for(int i=1; i<=n; i++)
    33             for(int j=a[i]; j<V; j++){
    34                 dp[i][j] = max(dp[i-1][j],dp[i-1][j-a[i]]+1);
    35             }
    36 
    37         int ans1 = 0, ans2;
    38         for(int i=0; i<V; i++){
    39             if(dp[n][i] > ans1){
    40                 // cout << ans1 << " " << i << " " << dp[n][i] << endl;
    41                 ans1 = dp[n][i];
    42                 ans2 = i;
    43             }
    44         }
    45         printf("Case %d: %d %d
    ",++cas,ans1+1,ans2+678);
    46     }
    47 
    48     return 0;
    49 }
  • 相关阅读:
    正则表达式
    文件上传例子
    如何做好数字化体验管理,了解一下?
    云原生背景下故障演练体系建设的思考与实践—云原生混沌工程系列之指南篇
    OpenKruise v1.0:云原生应用自动化达到新的高峰
    Spring Boot Serverless 实战系列“部署篇” | Mall 应用
    阿里云实时数仓Hologres年度发布,解读数仓新趋势
    基于 ASK + EB 构建容器事件驱动服务
    各位 PHPer,Serverless 正当时
    如何在零停机的情况下迁移 Kubernetes 集群
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827591.html
Copyright © 2011-2022 走看看