您的位置:首页 > Web前端

POJ 1170 Shopping Offers(01背包)

2012-08-11 15:36 323 查看
题目链接

好繁琐,想了好半天,开始以为暴搜。。比赛时一直卡这个题了,暴搜不出结果换了一个5维背包。。。瞎改一下过了,样例。。。交WA。。再改还是WA。。。

自己对背包,理解的太肤浅啊。。。其实我也不知道为什么过,在多次,WA后,正着写就A了,倒着写就是WA。。。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int p[6],o[6],kk[1001];
int cl[3001][6],vl[3001];
int q[6][6][6][6][6];
int main()
{
int c,k,v,s,i,j,a,b,n;
int a1,a2,a3,a4,a5;
scanf("%d",&b);
for(i = 1; i <= b; i ++)
{
scanf("%d%d%d",&c,&k,&v);
kk[c] = i;
p[i] = v;
o[i] = k;
}
scanf("%d",&s);
for(i = 1; i <= s; i ++)
{
scanf("%d",&j);
for(k = 1; k <= j; k ++)
{
scanf("%d%d",&c,&a);
cl[i][kk[c]] = a;
}
scanf("%d",&vl[i]);
}
n = s;
for(a1 = 0;a1 <= o[1];a1 ++)
{
for(a2 = 0;a2 <= o[2];a2 ++)
{
for(a3 = 0;a3 <= o[3];a3 ++)
{
for(a4 = 0;a4 <= o[4];a4 ++)
{
for(a5 = 0;a5 <= o[5];a5 ++)
{
q[a1][a2][a3][a4][a5] = a1*p[1]+a2*p[2]+a3*p[3]+a4*p[4]+a5*p[5];
}
}
}
}
}
for(i = 1;i <= n;i ++)
{
for(a1 = cl[i][1];a1 <= o[1]; a1 ++)//比赛的时候逆着写怎么都不对。。
{
for(a2 = cl[i][2];a2 <= o[2]; a2 ++)
{
for(a3 = cl[i][3];a3 <= o[3];a3 ++)
{
for(a4 = cl[i][4];a4 <= o[4]; a4 ++)
{
for(a5 = cl[i][5];a5 <= o[5];a5 ++)
{
if(q[a1][a2][a3][a4][a5] > q[a1-cl[i][1]][a2-cl[i][2]][a3-cl[i][3]][a4-cl[i][4]][a5-cl[i][5]]+vl[i])
q[a1][a2][a3][a4][a5] = q[a1-cl[i][1]][a2-cl[i][2]][a3-cl[i][3]][a4-cl[i][4]][a5-cl[i][5]]+vl[i];
}
}
}
}
}
}
printf("%d\n",q[o[1]][o[2]][o[3]][o[4]][o[5]]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: