[vijos1426]兴奋剂检查(多维背包)

来源:互联网 发布:自动上色软件 编辑:程序博客网 时间:2024/05/16 17:02

题目:

我是超链接

题解:

来做一些很水的背包?
多重背包?好多维的状态呢,这个东西很大啊f数组存不下怎么办?
给每种不同的包的组合编一个唯一的号即可,每一种方案对应cc[i]中的一个数字,类似于hash的思想

代码:

#include <cstdio>#include <iostream>using namespace std;int cc[10],v[10],dp[5000005],ans=0;int hash1(int a,int b,int c,int d,int e){    return a*(cc[2]+1)*(cc[3]+1)*(cc[4]+1)*(cc[5]+1)+b*(cc[3]+1)*(cc[4]+1)*(cc[5]+1)+c*(cc[4]+1)*(cc[5]+1)+d*(cc[5]+1)+e;}int main(){    int n,m,i,j,a,b,c,d,e;    scanf("%d%d",&n,&m);    for (i=1;i<=m;i++) scanf("%d",&cc[i]);    for (i=1;i<=n;i++)    {        int x;        scanf("%d",&x);        for (j=1;j<=m;j++) scanf("%d",&v[j]);        for (a=cc[1];a>=v[1];a--)          for (b=cc[2];b>=v[2];b--)            for (c=cc[3];c>=v[3];c--)              for (d=cc[4];d>=v[4];d--)                for (e=cc[5];e>=v[5];e--)                 {                    int p=hash1(a,b,c,d,e),q=hash1(a-v[1],b-v[2],c-v[3],d-v[4],e-v[5]);                    dp[p]=max(dp[p],dp[q]+x);                    ans=max(ans,dp[p]);                }    }    printf("%d",ans); }
原创粉丝点击