poj1170shopping office(DP背包问题)

本文介绍了一种使用动态规划解决购物折扣问题的方法。该问题包含商品编号、购买数量及单价等信息,并通过多种打折方案寻找最优解。文中提供了一个具体的C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求大体是这样的:一个商店至多有五种商品,给出每种商品的编号和购买数量以及单价,然后给出几种打折方案,比如一件商品你买多件总价格会便宜一些或是你买特定的几种商品并且买特定的数量总价格也会减少。

背包问题,通过动归找到最优方案……~o( =∩ω∩= )m


代码在这:

/*poj1170shopping office*/
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
int m,n,v;
int i,j;
int B; //商品种类数量
int c[1000]; //商品编号
int k[6]; //商品数量
int p[6]; //单品价格
int s; //优惠方案种类数量
int pay[6][6][6][6][6]; //最佳优惠方案总费用

int min(int a,int b)
{
     return a>b?b:a;
}
struct VIEW
{
	int q[6]; //优惠所需每种物品量
	int money; //优惠组合总价格
}view[101];

int dp(int a,int b,int c,int d,int e)
{
     int i;
	if(a<0||b<0||c<0||d<0||e<0) return 10000000;
	if(pay[a][b][c][d][e]>=0) return pay[a][b][c][d][e];
	pay[a][b][c][d][e]=a*p[1]+b*p[2]+c*p[3]+d*p[4]+e*p[5];

	for(i=1;i<=s;++i)
	{
		pay[a][b][c][d][e]=min(pay[a][b][c][d][e],view[i].money+dp(a-view[i].q[1],b-view[i].q[2],c-view[i].q[3],d-view[i].q[4],e-view[i].q[5]));
	}
	return pay[a][b][c][d][e];
}

int main()
{
     memset(pay,-1,sizeof(pay));
	scanf("%d",&B);

	for(i=1;i<=B;++i)
	{
		scanf("%d%d%d",&n,&k[i],&p[i]);
		c[n]=i;
	}
	scanf("%d",&s);

	for(i=1;i<=s;++i)
	{
		scanf("%d",&v);
		for(j=1;j<=v;++j)
		{
			scanf("%d%d",&n,&m);
			view[i].q[c[n]]=m;
		}
		scanf("%d",&view[i].money);
	}
	pay[0][0][0][0][0]=0;
	int res=dp(k[1],k[2],k[3],k[4],k[5]);

	printf("%d\n",res);

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值