动态规划题,注意所有数都是正整数,详细见注释。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
int len[MAXN], num[MAXN], sum[MAXN]; //段长,数字,和
int dp[MAXN][MAXN]; //dp[i][j]表示从前j个数中选择i段,和的最大值
int main()
{
int n;
int m;
while (cin >> n)
{
if (n == 0)
break;
memset(sum, 0, sizeof(sum));
memset(dp, 0, sizeof(dp));
cin >> m;
for (int i = 1; i <= m; i++) //输入段长
{
cin >> len[i];
}
for (int i = 1; i <= n; i++) //输入数字
{
cin >> num[i];
sum[i] = sum[i - 1] + num[i]; //求和
}
for (int i = 1; i <= m; i++) //动态规划
{
for (int j = len[i]; j <= n; j++) //是否将第j个数作为第i段的最后一个数
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j - len[i]] + sum[j] - sum[j - len[i]]);
}
cout << dp[m][n] << endl;
}
return 0;
}
继续加油。