首页 > 编程语言 >dfs与贪心算法——洛谷5194

dfs与贪心算法——洛谷5194

时间:2024-09-15 20:24:00浏览次数:1  
标签:cnt 洛谷 int 5194 dfs summ 砝码 long

问题描述:
有n个砝码,将砝码从大到小排列,从第三个砝码开始,所有砝码均大于其前两个砝码之和,问怎样的砝码组合才可以组合出不大于c的最大重量,输出该重量
输入:
第一行输入两个个整数N,c,代表有N个砝码,第二行输入N个砝码的质量
输出:
不大于c的最大重量

题目分析:
要找到不大于c的最大重量,要不断逼近c,按贪心算法来讲,肯定是先拿最大的,然后在拿小的,因为小质量的砝码更可以做到逼近而不超过,但这样任然有很多组合,要找到最优的组合,可以利用dfs搜索所有组合,仔细想想这种砝码用了由于超过c而被舍弃的砝码可能会被再次利用吗,肯定可以再次利用,那么理应使用vis标记,但我试了下把vis删去居然也可以AC,我人傻了,难道所有的测试用例都可以贪心+暴力,不理解,但仔细想想好像也是,我们在循环部分,也是从大到小用砝码的没有回去用的。。。

#include<bits/stdc++.h>
using namespace std;
long long int n,c,ans=0,x;
long long int a[1999],summ[1999];
bool vis[1999];

void dfs(int cnt,long long int mm){
    vis[cnt+1]=1;
    
    //剪枝1:质量和不能大于c
    if(mm>c)return;

    //剪枝2:此时前面所有数之和还小于ans,也没必要继续搜索了
    if(mm+summ[cnt]<=ans)return;

    if(ans<mm)ans=mm;//比较ans与现选数之和

    if(mm+summ[cnt]<=c&&mm+summ[cnt]>=ans){
	//此数之后全选的情况,与现ans比较 
        ans=mm+summ[cnt];
        return;
    }

    //注意这里的cnt会随递归函数变化
    for(int i=cnt;i>=1;i--){
        if(vis[i]==0){
          dfs(i-1,mm+a[i]);//正常的dfs ,从最大的砝码开始增加
          flag[i]=0;
        }
    }
}
int main(){
    cin>>n>>c;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]>c)break;//大于c的数不计入数组 
	//记录前缀和
        summ[i]=summ[i-1]+a[i];
	//记录使用砝码数量
        x++;
    }
    dfs(x,0);
    cout<<ans;
    return 0;
}


标签:cnt,洛谷,int,5194,dfs,summ,砝码,long
From: https://www.cnblogs.com/oQAQo/p/18415569

相关文章

  • 打卡信奥刷题(761)用Scratch图形化工具信奥P5713[普及组/提高组] 【深基3.例5】洛谷团队
    【深基3.例5】洛谷团队系统题目描述在洛谷上使用团队系统非常方便的添加自己的题目。如果在自己的电脑上配置题目和测试数据,每题需要花费时间555分钟;而在洛谷团队中上......
  • 【洛谷 P1596】[USACO10OCT] Lake Counting S 题解(深度优先搜索)
    [USACO10OCT]LakeCountingS题面翻译由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个的网格图表示。每个网格中有水(W)或是旱地(.)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,......
  • 洛谷题单指南-分治与倍增-P2415 集合求和
    原题链接:https://www.luogu.com.cn/problem/P2415题意解读:计算集合所有子集中元素之和。解题思路:集合的特性:互异性,元素各不相同来看样例:23,可以组成的子集有空23232和3都出现2次再比如:123,可以组成的子集有空12312 13231231,2,3各出现4次由于在集合中......
  • 洛谷P1004
    题目传送门:传送门p1004题目背景NOIP2000提高组T4题目描述设有 N×NN×N 的方格图 (N≤9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 00。如下图所示(见样例):某人从图的左上角的 AA 点出发,可以向下行走,也可以向右走,直到到达右下角的 BB ......
  • 洛谷P1006
    题目传送门:传送门p1006题目描述小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排坐成一个 mm 行 nn 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要......
  • 【LGR-200-Div.4】洛谷入门赛 #27 A-H题解
    A#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;mt19937rnd(time(0));#defineintlonglongtypedeftuple<int,int,int>tp;#definexfirst#defineysecondtypedefpair<int,int>pii;typedefpair<double,double>......
  • dfs 验证搜索二叉树——leetcode98
    代码来自leetcode官方一开始我自己写这个代码时只注意当前节点是否会存在空指针,并没有注意到他的孩子节点也有可能为空,绕了我好久。。。。。。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;......
  • bfs与dfs ,全球变暖——蓝桥problems178
    问题描述:........##.....##........##...####....###........有一张还以N*N的像素照片,“.”表示海洋,“#”表示陆地,其中上下左右能连在一起的陆地称作岛屿,例如上图有两座岛屿,由于全球气候变暖,靠经海洋的陆地会被淹没,问图中有多少座岛屿会被完全淹没..........................
  • Hadoop(十)HDFS API操作
    API操作Shell操作是在集群内部,即hadoop102上进行操作,API操作是希望在Windows上能远程连接集群实现增删改查操作一、客户端环境准备1、找到资料包路径下的Windows依赖文件夹,拷贝hadoop-3.1.0到非中文路径2、在Windows上配置HADOOP_HOME环境变量3、配置Path环境变量4、验证H......
  • 洛谷题单指南-分治与倍增-P7167 [eJOI2020 Day1] Fountain
    原题链接:https://www.luogu.com.cn/problem/P7167题意解读:从喷泉任意一个圆盘倒水,水流经的圆盘直径必须递增,水最后流到哪个圆盘。解题思路:1、枚举法有30%的数据范围在N<=1000,Q<=1000,因此枚举也可以得到30分。可以通过单调栈预计算每个圆盘后面第一个直径更大的圆盘位置Next[......