[题解|总结] 背包问题 [NOIP2010]乌龟棋
作者:互联网
https://ac.nowcoder.com/acm/problem/16590
目录
思路
分析一下数据范围 暴力? 160! 不行
重新理清思路
每次只能拿一张牌,每张牌都有限制
背包?妥妥的背包,分组背包?每组多个,一组拿一个,只能拿一组
好就是这样
code:
#include <bits/stdc++.h>
using namespace std;
const int N = 60,M = 500;
int n,m;
int dp[N][N][N][N],cnt[N],a[M];
void solve()
{
cin>>n>>m;
for(int i=0; i<n; i++)
cin>>a[i];
for(int i=1; i<=m; i++)
{
int x;
cin>>x;
cnt[x]++;
}
dp[0][0][0][0] = a[0];
for(int i = 0; i<=cnt[1]; i++)
{
for(int j=0; j<=cnt[2]; j++)
{
for(int t=0; t<=cnt[3]; t++)
{
for(int k=0; k<=cnt[4]; k++)
{
if(i)
dp[i][j][t][k] = max(dp[i][j][t][k],dp[i-1][j][t][k]+a[i+2*j+3*t+4*k]);
if(j)
dp[i][j][t][k] = max(dp[i][j][t][k],dp[i][j-1][t][k]+a[i+2*j+3*t+4*k]);
if(t)
dp[i][j][t][k] = max(dp[i][j][t][k],dp[i][j][t-1][k]+a[i+2*j+3*t+4*k]);
if(k)
dp[i][j][t][k] = max(dp[i][j][t][k],dp[i][j][t][k-1]+a[i+2*j+3*t+4*k]);
}
}
}
}
cout<<dp[cnt[1]][cnt[2]][cnt[3]][cnt[4]]<<endl;
}
int main()
{
solve();
return 0;
}
标签:cnt,背包,NOIP2010,int,题解,code,max,乌龟,dp 来源: https://blog.csdn.net/qq_34364611/article/details/117950785