基于C++实现剪绳子问题,既将一根长度为N的绳子,剪成M段,使M段的乘积最大。如,长度为10的绳子,最大乘积为36。使用动态规划和贪心算法实现,具体代码如下:
#include "stdio.h"
#include "stdlib.h"
#include <iostream>
using namespace std;
//******************--动态规划问题---剪绳子问题--*********************
int maxProductAfterCutting_solution(int num)
{
if (num<2)
return 0;
if (num == 2)
return 1;
if (num == 3)
return 2;
int* product = new int[num + 1];
product[0] = 0;
product[1] = 1;
product[2] = 2;
product[3] = 3;
int max = 0;
for (int i = 4; i <= num; i++)
{
max = 0;
for (int j = 1; j <= i / 2; j++)
{
int prod = product[j] * product[i - j];
if (prod>max)
max = prod;
}
product[i] = max;
}
max = product[num];
return max;
}
//******************-贪心算法---剪绳子问题--*********************
int maxProductAfterCutting_solution2(int num)
{
if (num<2)
return 0;
if (num == 2)
return 1;
if (num == 3)
return 2;
int timeOf3 = num / 3;
if (num % 3 == 1)
timeOf3--;
int timeOf2 = (num - 3 * timeOf3) / 2;
return (int)(pow((double)3, timeOf3)) * (int)(pow((double)2, timeOf2));
}
int main()
{
int num = 10;
int res = 0;
res = maxProductAfterCutting_solution(num);
printf("%dn", res);
int res2 = maxProductAfterCutting_solution2(num);
printf("%dn", res2);
system("pause");
return 0;
}
运行结果如下: