题目链接:http://poj.org/problem?id=1170
————————————————————————————————————————————
题目思路:
基本的五维背包,把数据初始化好,问题就解决了一大半。
————————————————————————————————————————————
源代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define INF 10000000
#define min(a,b) ((a)>(b)?(b):(a))
struct itemtype
{
int n;
int subject[6];
int num[6];
int price;
}item[110];
int main()
{
int dp[6][6][6][6][6];
int i0 = 0,i1 = 0,i2 = 0,i3 = 0,i4 = 0;
int b = 0,i = 0,j = 0,s = 0;
int price[6],num[6],code[6];
memset(price,0,sizeof(price));
memset(code,0,sizeof(code));
memset(num,0,sizeof(num));
memset(item,0,sizeof(item));
scanf("%d",&b);
for(i = 0 ;i<b;i++)
scanf("%d%d%d",&code[i],&num[i],&price[i]);
scanf("%d",&s);
for(i = 0;i<s;i++)
{
scanf("%d",&item[i].n);
for(j = 0;j<item[i].n;j++)
{
int temp = 0,k = 0,temp2 = 0;
scanf("%d%d",&temp,&temp2);
for(k = 0;k<b;k++)
if(code[k] == temp)
break;
item[i].subject[k] = 1;
item[i].num[k] = temp2;
}
scanf("%d",&item[i].price);
}
for(j = 0;j<b;j++)
{
item[i].n = 1;
item[i].subject[j] = 1;
item[i].num[j] = 1;
item[i].price = price[j];
i++;
}
for(i0 = 0;i0<=5;i0++)
for(i1 = 0;i1<=5;i1++)
for(i2 = 0;i2<=5;i2++)
for(i3 = 0;i3<=5;i3++)
for(i4 = 0;i4<=5;i4++)
dp[i0][i1][i2][i3][i4] = INF;
dp[0][0][0][0][0] = 0;
for(i0 = 0;i0<=num[0];i0++)
for(i1 = 0;i1<=num[1];i1++)
for(i2 = 0;i2<=num[2];i2++)
for(i3 = 0;i3<=num[3];i3++)
for(i4 = 0;i4<=num[4];i4++)
for(i = 0;i<s+b;i++)
if(i0>=item[i].num[0] && i1>=item[i].num[1] && i2>=item[i].num[2] && i3>=item[i].num[3] && i4>=item[i].num[4])
dp[i0][i1][i2][i3][i4] = min(dp[i0][i1][i2][i3][i4],item[i].price+dp[i0-item[i].num[0]][i1-item[i].num[1]][i2-item[i].num[2]][i3-item[i].num[3]][i4-item[i].num[4]]);
printf("%d",dp[num[0]][num[1]][num[2]][num[3]][num[4]]);
return 0;
}