动态规划 整数拆分问题

给定一个整数 要求拆分多少项 然后求最大乘积

这个有一个困难就是考虑 分成多少项 当分的项可以是为1时

首先明晰这个a[i] 是 数字i 可以被拆分得到的最大乘积

int n; cin >> n;// 被分解的数
    a[1] = 1, a[2] = 2;// 1 2 都只有一种分法
    for(int i = 3; i <= n; i++)
    {
        for(int j= 1; j <= i/2; j++)
        {
            a[i] = MAX(a[i], a[i-j] * a[j], i);// 这里MAX是自己定义的三个函数值返回最大的一个值 也可用两层max  这里介绍下含义 第i 个数分解的最大值 可能是 i 本身 也就是不分解 还可能是 分解成两个 两个以上 而这个a[i-j] * a[j] 就是分解成两个或以上的最大值
        }
    }
    for(int i = 1; i <= n; i++)
    {
        cout << a[i] << ' ';
    }

因为上述代码中 有个i 也就是不分解 所以 上述是最少分解成一个数的最大乘积

如果是至少分解成两项

#include<bits/stdc++.h>
using namespace std;
typedef struct ListNode *List;
typedef long long ll;
const int MX = 1e4;
int a[MX];
int n, m;
ll sum;
int MAX(int x, int y, int z)
{
    return x > y ? x > z ? x : z : y > z ? y : z;
}
int main()
{
    int n; cin >> n;
    a[2] = 1;
    for(int i = 3; i <= n; i++)
    {
        for(int j = 1; j <= i/2; j++)
        {
            a[i] = MAX(a[i], a[i-j]*j, (i-j)*j);
             /*这里的a[i] 表示 i 至少分解为两项时的最大值
             上述要么是分解成i-j 和 j -- 两项 
            要么是三项及以上 
            为什么这里的j 不用分解 因为在从小到大的遍历中 其实相当于把j 分解的那部分放到了a[i-j]中
            例如 数字9 是 3 3 3 那我 6 * a[3] 和 3 * a[6] 其实都一样 只不过我把这个j的分解
            放到了 i-j的分解中  因为他最大值的分解方式是确定 比如10 无论你怎么弄 肯定是分解成两个3一个4
            
            */
            
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值