• 2021.5.27 开心赛(背包经典题)


    我金明那道破题还是错了!没开long long!


    一、感想

    蒟蒻如我,第一题想了半天都没想出来最大总和是多少……其它题倒是挺简单的,但是第一遍交的时候也卡了十分二十分的,因为数组开小了!这已经是我第n次因为数组开小而卡分了。现在还没结束比赛,但是我看到有两道题有一个人只拿了部分分,好慌,感觉那个人是我……

    还是来说题吧!

    二、题解

    1、砝码称重

    • 分析:这题就是多重背包的板子题。我认为主要的难点在如何求所能称出的最大质量。再其他就没有什么了。按重量枚举,最后循环统计能称出的质量的种类数就好了。
    • 代码实现
    #include <bits/stdc++.h>//万能头并非长远之计,小朋友们不要学姐姐
    using namespace std; int a[7];
    int dp[10005]={};
    long long sum=0,ans=0; 
    int t[7]; 
    int main() 
    { 
        t[1]=1;t[2]=2;
        t[3]=3;t[4]=5;
        t[5]=10;t[6]=20;
        for(int i=1;i<=6;i++)
        {
            scanf("%d",&a[i]);
            sum+=t[i]*a[i];//求能称出的最大质量
             }
        for(int i=1;i<=6;i++) 
        { 
            for(int j=sum;j>=0;j--)//按称出的质量枚举 
            {
                for(int k=0;k<=a[i];k++)//选k个砝码 { if(j>=t[i]*k) 
                {
                    dp[j]=max(dp[j],dp[j-t[i]*k]+t[i]*k);//多重背包状态转移
                }
            }
        }
        
        for(int i=1;i<=sum;i++)
        {
            if(dp[i]==i)
                ans++;
        }
        printf("Total=%d",ans);
        return 0;
        }

    2、装箱问题

    • 01背包板子题。不过这题稍微变了一下,题中的物体体积既是板子里的物体体积,也是板子里的物体价值。
    • 代码实现
      #include<cstdio>
      using namespace std;
      int m,n;      
      int f[20010];
      int w[400];
      
      int main()
      {
          int i,j;
          scanf("%d %d",&m,&n);
          for(i=1;i<=n;i++){
              scanf("%d",&w[i]);
          }
          for(i=1;i<=n;i++){
              for(j=m;j>=w[i];j--){                 
                  if(f[j]<f[j-w[i]]+w[i]){
                      f[j]=f[j-w[i]]+w[i];
                  }
              }
          }
          printf("%d",m-f[m]);
          return 0;
      }

    3、采药

    • 这个没什么好说的。懒得说了,参照装箱即可。

    4、开心的金明

    • 这道题我被卡了20分。其实我第一遍提交是A了的,但是我看到有一个人没过。我以为是我。我就把数组开的大到突破天际!心累……
    • 代码实现
      #include <bits/stdc++.h>
      using namespace std;
      int n,m;
      int v[30005],p[30005],dp[30005];
      int main()
      {
          scanf("%d %d",&n,&m);
          for(int i=1;i<=m;i++)//顺手写了一个<=n…… 
          {
              scanf("%d %d",&v[i],&p[i]);
          }
          for(int i=1;i<=m;i++)
          {
              for(int j=n;j>=v[i];j--)
              {
                  dp[j]=max(dp[j],dp[j-v[i]]+v[i]*p[i]);
              }
          }
          printf("%d",dp[n]);
          return 0;
      }

    5、竞赛总分

    • 完全背包板子。
    • 代码实现
      #include <bits/stdc++.h>
      using namespace std;
      int m,n;
      int t[10005],c[10005];
      int dp[10005];
      
      int main()
      {
          scanf("%d %d",&m,&n);
          for(int i=1;i<=n;i++)
          {
              scanf("%d %d",&c[i],&t[i]);
          }
          
          dp[0]=0;
          for(int i=1;i<=n;i++)
          {
              for(int j=t[i];j<=m;j++)
              {
                  
                  dp[j]=max(dp[j],dp[j-t[i]]+c[i]);
              }
          }
          printf("%d",dp[m]);
          return 0;
      }
      /*
      0
      */
      好了,完结!
  • 相关阅读:
    springcloud:Eureka的使用
    使用tomcat脚本开启服务
    安装Mysql
    springcloud:RPC和HTTP
    vue elementui点击表格当前行radio单选选中
    启动easy-mock
    项目使用的注解
    vue在element-ui的dialog弹出框中加入百度地图
    【转载】linux查看端口状态相关命令
    【记录】linux 文件权限的查看和修改
  • 原文地址:https://www.cnblogs.com/TheZealous/p/14819722.html
Copyright © 2020-2023  润新知