其他分享
首页 > 其他分享> > [题解|总结] 背包问题 [NOIP2010]乌龟棋

[题解|总结] 背包问题 [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