类似于01背包,这一类还没理解透彻,不知道怎么说出他们的区别。
http://codevs.cn/problem/1068/
//起始位置是1所以要计算1的分值
#include<iostream>
#include<algorithm>
using namespace std;
int shu[41][41][41][41] = { 0 };
int main()
{
int n, m;
int a[351] = { 0 };
int b[5] = { 0 };
cin >> n >> m;
for (int i = 0; i <n; i++)
{
cin >> a[i];
}
for (int i = 0; i < m; i++)
{
int temp;
cin >> temp;
b[temp]++;
}
for (int i = 0; i <=b[1]; i++)
{
for (int j = 0; j <= b[2]; j++)
{
for (int k = 0; k <=b[3]; k++)
{
for (int l = 0; l <= b[4]; l++)
{
int temp = 0;
//需要注意i=0 i-1=-1运行报错
if (i)
{
temp = max(temp, shu[i - 1][j][k][l]);
}
if (j)
{
temp = max(temp, shu[i][j-1][k][l]);
}
if (k)
{
temp = max(temp, shu[i][j][k-1][l]);
}
if (l)
{
temp = max(temp, shu[i][j][k][l-1]);
}
shu[i][j][k][l] =temp + a[i + 2 * j + 3 * k + 4 * l];
}
}
}
}
cout << shu[b[1]][b[2]][b[3]][b[4]]<<endl;
return 0;
}