王师傅是一名卸货工人,现在有n个货物,由于王师傅一次可以同时卸2个货物,所以决定今天先卸其中的2*m个货物。每次卸货物消耗的体力值计算公式为,假如2个货物的质量分别为x和y,消耗的体力值为(x*y)的4次方,现给出n个货物分别的质量。求王师傅卸完2*m个货物后消耗的体力值是多少。
例如:
输入: 9 4
1 3 7 9 10 17 20 22
输出:
64
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include<math.h>
using namespace std;
#define MAX 10000
int pack(int arr[], int n, int m)
{
int src[10][10] = { 0 };
int tmp = 0, sub = 0;
int i, j;
for (i = 0; i < n;)
{
for (j = 0; j <= m; j++)
{
if (j == 0)
{
src[i][j] = 0;
}
else if (i <= j * 2 - 2)
{
src[i][j] = MAX;
}
else
{
if (i == 1)
{
src[i][j] = tmp;
}
else
{
if ((tmp + src[i - 2][j - 1]) < src[i - 1][j])
{
src[i][j] = tmp + src[i - 2][j - 1];
}
else
{
src[i][j] = src[i - 1][j];
}
}
}
printf("%d", src[i][j]);
printf("\t");
printf("\t");
}
printf("\n");
i++;
sub = arr[i] - arr[i - 1];
tmp = (int)pow(sub, 4);
}
printf("\n");
return src[n-1][m];
}
int main()
{
int n, m;
cin >> n >> m;
int arr[100];
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
cout << endl;
int ret = pack(arr, n, m);
printf("最少要耗费的体力是%d\n", ret);
system("pause");
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/8f29e8787d46d8b7119d79cb63c9c7f4.png)