您的位置:首页 > 其它

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

2017-10-25 09:01 155 查看

题目:

我是超链接

题解:

来做一些很水的背包?

多重背包?好多维的状态呢,这个东西很大啊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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: