当前位置: 首页 > news >正文

洛谷 P1734 最大约数和 C语言

P1734 最大约数和 - 洛谷 | 计算机科学教育新生态

题目描述

选取和不超过 S 的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。

输入格式

输入一个正整数 S。

输出格式

输出最大的约数之和。

输入输出样例

输入 #1复制

11

输出 #1复制

9

说明/提示

【样例说明】

取数字 4 和 6,可以得到最大值 (1+2)+(1+2+3)=9。

【数据规模】

对于 100% 的数据,1≤S≤1000。

思路:

题目的意思是选取诺干个数,这些数之和小于n,求出这些数的约数最大和。

我们预处理把每个数的约数写出来。然后就是背包问题了。

注意只有dp会满分

代码如下:

暴力:
#include <iostream>
#include<algorithm>
#include<string>
using namespace std;
typedef long long ll;
const ll N = 2001;
ll cnt[N];
ll num[N];
ll n;
int is_number(ll x)
{int sum = 0;for(ll i = 1 ; i < x ; i++){if(x % i == 0)sum += i;}return sum;
}
ll dfs(ll x,ll sp)
{if(x > n-1)return 0;if(sp >= num[x])return max(dfs(x+1,sp-num[x])+cnt[x],dfs(x+1,sp));elsereturn dfs(x+1,sp);}int main()
{cin >> n;for(ll i = 1 ; i <= n-1 ; i++){cnt[i] += is_number(i);//求出1~n-1的各个约数之和 
//    	cout << i << "的约数之和:" << arr[i] << endl;num[i] = i; }cout << dfs(1,n);return 0;}
记忆化搜索:
#include <iostream>
#include<algorithm>
#include<string>
using namespace std;
typedef long long ll;
const ll N = 2001;
ll cnt[N];
ll num[N];
ll n;
ll mem[N][N];
int is_number(ll x)
{int sum = 0;for(ll i = 1 ; i < x ; i++){if(x % i == 0)sum += i;}return sum;
}
ll dfs(ll x,ll sp)
{ll sum = -1e9;if(mem[x][sp])return mem[x][sp];if(sp <= 0)return 0;if(x > n-1)return 0;if(sp >= num[x])sum = max(dfs(x+1,sp-num[x]) + cnt[x],dfs(x+1,sp));elsesum = dfs(x+1,sp);mem[x][sp] = sum;return sum;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for(ll i = 1 ; i < n ; i++){cnt[i] += is_number(i);//求出1~n-1的各个约数之和 
//    	cout << i << "的约数之和:" << arr[i] << endl;num[i] = i; }cout << dfs(1,n);return 0;}

dp:
 

#include <iostream>
#include<algorithm>
#include<string>
using namespace std;
typedef long long ll;
const ll N = 2001;
ll cnt[N];
ll num[N];
ll n;
ll f[N][N];
int is_number(ll x)
{int sum = 0;for(ll i = 1 ; i < x ; i++){if(x % i == 0)sum += i;}return sum;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for(ll i = 1 ; i < n ; i++){cnt[i] += is_number(i);//求出1~n-1的各个约数之和 
//    	cout << i << "的约数之和:" << arr[i] << endl;num[i] = i; }for(ll i = n-1 ; i >= 1 ; i--){for(ll j = 0 ; j <= n ; j++){if(j >= num[i])f[i][j] =  max(f[i+1][j-num[i]] + cnt[i],f[i+1][j]);elsef[i][j] = f[i+1][j]; 	}	}cout << f[1][n];return 0;}

http://www.lryc.cn/news/529879.html

相关文章:

  • Golang 执行流程分析
  • python学opencv|读取图像(五十一)使用修改图像像素点上BGR值实现图像覆盖效果
  • Flask数据的增删改查(CRUD)_flask删除数据自动更新
  • kamailio-ACC模块介绍【kamailio6.0. X】
  • 数据库对象
  • EtherCAT主站IGH-- 27 -- IGH之globals.h文件解析
  • 2025多目标优化创新路径汇总
  • 15JavaWeb——Maven高级篇
  • 使用Ollama本地化部署DeepSeek
  • 蓝桥杯刷题DAY1:前缀和
  • 【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户注册
  • MINIRAG: TOWARDS EXTREMELY SIMPLE RETRIEVAL-AUGMENTED GENERATION论文翻译
  • 微服务入门(go)
  • Baklib揭示内容中台实施最佳实践的策略与实战经验
  • C++11新特性之lambda表达式
  • 洛谷 P10289 [GESP样题 八级] 小杨的旅游 C++ 完整题解
  • 使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践
  • JWT入门
  • Python - Quantstats量化投资策略绩效统计包 - 详解
  • 智慧园区管理系统推动企业智能运维与资源优化的全新路径分析
  • 【数据结构-字典树】力扣14. 最长公共前缀
  • 《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(31):HTTPS和TLS/SSL
  • Go学习:Go语言中if、switch、for语句与其他编程语言中相应语句的格式区别
  • L30.【LeetCode笔记】设计链表
  • java日志框架详解-Log4j2
  • C++中vector追加vector
  • 加一(66)
  • 远程连接-简化登录
  • canvas的基本用法
  • Tailwind CSS - Tailwind CSS 引入(安装、初始化、配置、引入、构建、使用 Tailwind CSS)