POJ --1170 -Shopping Offers--DP

33 篇文章 1 订阅

五维DP,蛋碎了,,很久不写题解的我也想记下这段优美的代码了

#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 1000
using namespace std;
int code[6];	//each item's code
int dcode[maxn];	//dcode[code]=index
int num[6];		//each item's number
int price[6];	//each item's price
int sale_item_number[110][6];	//each item's number in every special offer
int sale_count[110],sale_price[110];	//each special offer's item number and special cost
int n;	//tot item in basket
int pn;	//the number of special offer
int dp[6][6][6][6][6];	//dp array ,what you understand;

void init()
{
	int coode,idx;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>code[i]>>num[i]>>price[i];
		dcode[code[i]]=i;
	}
	cin>>pn;
	memset(sale_item_number,0,sizeof(sale_item_number));
	for(int i=0;i<pn;i++)
	{
		cin>>sale_count[i];
		for(int j=0;j<sale_count[i];j++)
		{
			cin>>coode;idx=dcode[coode];
			cin>>sale_item_number[i][idx];
		}
		cin>>sale_price[i];
	}
}
void solve()
{
	memset(dp,-1,sizeof(dp));
	int i0,i1,i2,i3,i4;
	int i,j;
	int & aim=dp[num[0]][num[1]][num[2]][num[3]][num[4]];
	aim=0;
	for(i=0;i<5;i++)
	{
		aim+=num[i]*price[i];
	}
	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<=pn;i++)
						{
							 int & uv =dp[i0][i1][i2][i3][i4];
							 if(sale_item_number[i][0]>i0||
							 	sale_item_number[i][1]>i1||
							 	sale_item_number[i][2]>i2||
							 	sale_item_number[i][3]>i3||
							 	sale_item_number[i][4]>i4
							   )continue;
						     int bg= dp[i0-sale_item_number[i][0]]
 						  		 	   [i1-sale_item_number[i][1]]
					  				   [i2-sale_item_number[i][2]]
									   [i3-sale_item_number[i][3]]
									   [i4-sale_item_number[i][4]];
						     if(bg<0)continue;
							 int temp=sale_price[i]+bg;
						     if(uv==-1||temp<uv)
							 {
								 uv=temp;
								 int res=uv+(num[0]-i0)*price[0]+
								 			(num[1]-i1)*price[1]+
								 			(num[2]-i2)*price[2]+
								 			(num[3]-i3)*price[3]+
								 			(num[4]-i4)*price[4];
					 			if(aim==-1||res<aim)
					 			{
			 						aim=res;
			 					}
							 } 
						}
					}
				}
			}
		}
	}
	printf("%d\n",aim);
}


int main()
{
	freopen("1170.txt","r",stdin);
	init();
	solve();
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值