洛谷 P1094纪念品分组 题解
题目传送门
一道典型的贪心算法题。
题目内容不多说了,大致说一下代码的思路:
给定的所有纪念品中可以先用sort排一下顺序,然后从价格最高和最低的开始向中间靠拢(可以看做是指针),这样保证每组的搭配都是最优的。
看代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int w,n,a[100010],b[100010],cnt; 4 int main(){ 5 cin>>w>>n; 6 for(int i=1;i<=n;i++){ 7 cin>>a[i]; 8 b[i]=a[i]; 9 }//设置一个b数组后面用于判断此纪念品是否已被分组 10 sort(a+1,a+n+1);//排序 11 int k=n,m=1;//用k记录剩余未分组的纪念品数量 12 while(k){ 13 if(b[n]!=0){//这个纪念品还未被分组 14 int sum=a[n];//从最大的开始 15 b[n]=0;//该纪念品已被分组 16 k--;//数量减1 17 for(int i=m;i<n;i++){//最多查找到当前选定的价格最高的纪念品 18 if(a[i]+sum<=w){//没有超出限制金额 19 sum+=a[i]; //累计纪念品价格 20 b[i]=0; 21 k--; 22 m++;//下次从这个往上找 23 continue; 24 } 25 else{ 26 cnt++; 27 break; 28 } 29 } 30 if(k==0){ 31 cnt++; 32 break; 33 } 34 //如果没有可以找的了,cnt+1,结束循环,防止上面的循环找到最后没有纪念品 35 } 36 n--;//下一次从比这次小得开始。 37 } 38 cout<<cnt; 39 return 0; 40 }
本文来自博客园,作者:张其勋,转载请注明原文链接:https://www.cnblogs.com/zhangqixun/p/17066775.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现