zoukankan      html  css  js  c++  java
  • 两道dp

    链接:https://ac.nowcoder.com/acm/contest/186/C?&headNav=www

    来源:牛客网
    终于Alice走出了大魔王的陷阱,可是现在傻傻的她忘了带武器了,这可如何是好???这个时候,一个神秘老人走到她面前答应无偿给她武器,但老人有个条件,需要将所选武器分别放在天平的两端,若天平平衡则可以将天平上的所有武器拿走,还好这个天平锈迹斑斑,只要两端重量相差小于等于m就会保持平衡,Alice傻傻的认为越重的武器越好,求Alice最多能拿走的武器总重量。(不限操作次数)

    题解:直接dp

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 int a[105];
     6 int dp[105][20005];
     7 int main(){
     8     int n,m;
     9     cin>>n>>m;
    10     for(int i=1;i<=n;i++){
    11         scanf("%d",&a[i]);
    12     }
    13     memset(dp,-1,sizeof(dp));
    14     for(int i=0;i<=n;i++)dp[i][10000]=0;
    15     for(int i=1;i<=n;i++){
    16         for(int j=0;j<=20005;j++){
    17             dp[i][j]=dp[i-1][j];
    18             if(dp[i-1][j-a[i]]!=-1)dp[i][j]=max(dp[i-1][j-a[i]]+a[i],dp[i][j]);
    19             if(dp[i-1][j+a[i]]!=-1)dp[i][j]=max(dp[i-1][j+a[i]]+a[i],dp[i][j]);
    20         }
    21     }
    22     int ans=0;
    23     for(int i=1;i<=n;i++)
    24     for(int j=10000-m;j<=10000+m;j++){
    25         ans=max(ans,dp[i][j]);
    26     }
    27     cout<<ans<<endl;
    28     return 0;
    29 }
    View Code

    http://www.hrbuacm.top/problem.php?id=5328

    来源:东北四省赛

    题意:给n张牌,总体力w,每张牌需要花费wi造成xi的伤害,同时每张牌可能会有两个属性,第一个属性可以在使用时使所有具有第二种属性的牌的w减1,计算最大伤害

    样例输入

    3 3
    3 3 1 1
    2 3 1 1
    1 3 1 1

    样例输出

    9
    思路:贪心+dp

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<set>
     6 #include<bitset>
     7 #include<vector>
     8 #include<map>
     9 using namespace std;
    10 typedef long long ll;
    11 const int maxn=705;
    12 int dp[maxn][maxn],ak[maxn];
    13 struct pot{
    14     int a;
    15     int b;
    16     int c;
    17     int d;
    18 }p[maxn];
    19 bool cmp(struct pot aa,struct pot bb){
    20     if(aa.d==bb.d){
    21             if(aa.c==bb.c)
    22             return aa.a<bb.a;
    23             else return aa.c>bb.c;
    24         }
    25     return aa.d<bb.d;
    26 }
    27 int main(){
    28     ios::sync_with_stdio(false);
    29     cin.tie(0);
    30     cout.tie(0);
    31     int n,w;
    32     cin>>n>>w;
    33     for(int i=1;i<=n;i++){
    34         cin>>p[i].a>>p[i].b>>p[i].c>>p[i].d;
    35     }
    36     int ans=0;
    37     sort(p+1,p+1+n,cmp);
    38     memset(dp,-1,sizeof(dp));
    39     dp[0][0]=0;
    40     for(int i=1;i<=n;i++){ak[i]=ak[i-1]+(p[i].c);}
    41     for(int i=1;i<=n;i++){
    42         for(int j=i;j>=0;j--){
    43             for(int k=w;k>=0;k--){
    44                 if(p[i].c){
    45                     int xx=max(0,p[i].a-j+1);
    46                     if(k>=xx&&p[i].d&&j&&dp[j-1][k-xx]!=-1){
    47                             dp[j][k]=max(dp[j][k],dp[j-1][k-xx]+p[i].b);
    48                     }
    49                     else if(k>=p[i].a&&j&&dp[j-1][k-p[i].a]!=-1)dp[j][k]=max(dp[j][k],dp[j-1][k-p[i].a]+p[i].b);
    50                 }
    51                 else{
    52                     int xx=max(0,p[i].a-j);
    53                     if(k>=xx&&p[i].d&&dp[j][k-xx]!=-1){
    54                             dp[j][k]=max(dp[j][k],dp[j][k-xx]+p[i].b);
    55                     }
    56                     else if(k>=p[i].a&&dp[j][k-p[i].a]!=-1)dp[j][k]=max(dp[j][k],dp[j][k-p[i].a]+p[i].b);
    57                 }
    58             ans=max(ans,dp[j][k]);
    59             }
    60         }
    61     }
    62     cout<<ans<<endl;
    63     return 0;
    64 }
    View Code

    (注意dp初始化为-1然后设置边界条件为0可以避免出现不存在情况继续向下更新的情况从而避免得到错误结果

  • 相关阅读:
    HTML 特殊符号编码对照表
    jsp include file(变量) 动态加载文件
    PHP判断键值数组是否存在,使用empty或isset或array_key_exists
    [js方法pk]之instanceof() vs isPrototypeOf() hasOwnProperty() vs propertyIsEnumerable()
    js正则表达式语法 修正
    js正则表达式语法
    js正则表达式语法
    ASP中有关字符编码转换的几个有用函数
    详解js中typeof、instanceof与constructor
    事件穿透父层 直达子层 pointer-events:none
  • 原文地址:https://www.cnblogs.com/MekakuCityActor/p/10537877.html
Copyright © 2011-2022 走看看