HDU - 3033 滚动数组有坑

Posted The Azure Arbitrator

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 3033 滚动数组有坑相关的知识,希望对你有一定的参考价值。

每层至少一个,滚动时要判上一层非法与否,所以每次都要memset

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rrep(i,j,k) for(int i=j;i>=k;i--)
#define scan(a) scanf("%d",&a)
using namespace std;
const int maxn = 5e5+11;
const int oo = 0x3f3f3f3f;
int n,m,K;
typedef pair<int,int> P;
vector<P> vec[16];
int dp[2][maxn];
int main(){
    while(scanf("%d%d%d",&n,&m,&K)!=EOF){
        rep(i,1,K) vec[i].clear();
        rep(i,1,n){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            vec[a].push_back(P(b,c)); 
        }
        bool flag=0;
        rep(i,1,K) if(!vec[i].size()) flag=1;
        if(flag){
            printf("Impossible\n");
            continue;
        }
        rep(i,0,m) dp[0][i]=0;
        rep(i,1,K){
            memset(dp[i&1],0x80,sizeof dp[i&1]); //滚动时注意 
            for(auto k:vec[i]){
                rrep(j,m,k.first){
                    int c=k.first,w=k.second;
                    dp[i&1][j]=max(dp[i&1][j],max(dp[i&1][j-c]+w,dp[i-1&1][j-c]+w));
                }
            }
        }
        if(dp[K&1][m]<0) printf("Impossible\n");
        else printf("%d\n",dp[K&1][m]);
    }
    return 0;
} 

以上是关于HDU - 3033 滚动数组有坑的主要内容,如果未能解决你的问题,请参考以下文章

hdu3033分组背包(每组最少选一个)

HDU-3033 I love sneakers! (分组背包)

hdu3033 I love sneakers! 分组背包变形(详解)

HDU The 3n + 1 problem(简单题 有坑)

hdu 4409 Family Name List(LCA&amp;有坑点)

hdu 3392(滚动数组优化dp)