【题目描述】
输入一个整数,输出为2的幂次项和的形式。
【输入样例】
26
【输出样例】
26=1+2+4+8+11
【算法分析】
理解了此题,就明白了多重背包问题的二进制优化的主要思想。
多重背包问题的二进制优化思想解析及题目详见 https://blog.csdn.net/hnjzsyjyj/article/details/126190151
为了方便说明问题,此处简述多重背包问题的二进制优化思想如下:
多重背包问题通常可转化成01背包问题求解。但若将每种物品的数量拆分成多个1的话,时间复杂度会很高,从而导致TLE。所以,需要利用二进制优化思想。即:一个正整数n,可以被分解成1,2,4,…,2^(k-1),n-2^k+1的形式。其中,k是满足n-2^k+1>0的最大整数。
例如,假设给定价值为2,数量为10的物品,依据二进制优化思想可将10分解为1+2+4+3,则原来单个价值为2,数量为10的物品可等效转化为价值分别为1*2,2*2,4*2,3*2,即价值分别为2,4,8,6,数量均为1的物品。
.
【算法代码一】
- #include
- using namespace std;
-
- int main() {
- int n;
- cin>>n;
- cout<
"="; -
- int k=1;
- while(k<=n) {
- if(k==n) cout<
- else cout<
"+"; - n=n-k;
- k=k*2;
- }
-
- if(n>0) {
- cout<
- }
-
- return 0;
- }
-
- /*
- in1:
- 26
- out1:
- 26=1+2+4+8+11
- in2:
- 7
- out2:
- 7=1+2+4
- */
【算法代码二】
- #include
- using namespace std;
-
- int main() {
- int n;
- cin>>n;
- cout<
"="; -
- int t=0;
- int k=1;
- while(k<=n) {
- if(k==n) cout<<"2^"<
- else cout<<"2^"<
"+"; - n=n-k;
- k=k*2;
- t++;
- }
-
- if(n>0) {
- cout<
- }
-
- return 0;
- }
-
- /*
- in1:
- 26
- out1:
- 26=2^0+2^1+2^2+2^3+11
- in2:
- 7
- out2:
- 7=2^0+2^1+2^2
- */
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/126190151
-
相关阅读:
web3 在React dapp中全局管理web3当前登录用户/智能合约等信息
Ext Direct 开发全介绍
MySQL高阶语句(二)
【MySQL Router】第 1 章 通用信息
Jetty Client IllegalArgumentException: Buffering capacity 2097152 exceeded
工作两年,没想到靠Python搞副业让我实现了财务自由
CAD图清晰打印设置
如何保护网站的网络安全
MarkDown常用命令
ARM-A架构入门基础(三)MMU
-
原文地址:https://blog.csdn.net/hnjzsyjyj/article/details/126244362
-
最新文章
-
沪漂五周年了:我越来越迷茫了
Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
MySQL-Seconds_behind_master的精度误差
[MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
Agent OS :五种驯服不确定性的范式
PortSwigger SQL注入LAB11
数据库即时编译JIT
[Begin]AI Learn Data Day 0
深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU