/*
ID: xujiahe1
PROG: shopping
LANG: C++
*/
#include <vector>
#include <map>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define pb(a) push_back(a);
map<int,int>myp;
struct node
{
int g[20],num[20];
int price;
}p[200];
int num,m,n;
int price[20];
int need[20];
int f[20][20][20][20][20];
int i1,i2,i3,i4,i5;
int get()
{
int tmp=0;
tmp+=i1*price[1];
tmp+=i2*price[2];
tmp+=i3*price[3];
tmp+=i4*price[4];
tmp+=i5*price[5];
return tmp;
}
bool check(int k)
{
if(i1<p[k].g[1])
return false;
if(i2<p[k].g[2])
return false;
if(i3<p[k].g[3])
return false;
if(i4<p[k].g[4])
return false;
if(i5<p[k].g[5])
return false;
return true;
}
void change(int k)
{
if(!check(k))
return ;
int tmp=f[i1][i2][i3][i4][i5];
tmp=min(tmp,f[i1-p[k].g[1]][i2-p[k].g[2]][i3-p[k].g[3]][i4-p[k].g[4]][i5-p[k].g[5]]+p[k].price);
f[i1][i2][i3][i4][i5]=tmp;
}
int main()
{
freopen("shopping.in","r",stdin);
freopen("shopping.out","w",stdout);
int total,a,b,c,v;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&total);
for(int j=1;j<=total;j++)
{
scanf("%d%d",&a,&b);
if(!myp[a])
{
num++;
myp[a]=num;
}
p[i].g[myp[a]]=b;
}
scanf("%d",&p[i].price);
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(!myp[a])
{
num++;
myp[a]=num;
}
need[myp[a]]=b;
price[myp[a]]=c;
}
for(i1=0;i1<=need[1];i1++)
{
for(i2=0;i2<=need[2];i2++)
{
for(i3=0;i3<=need[3];i3++)
{
for(i4=0;i4<=need[4];i4++)
{
for(i5=0;i5<=need[5];i5++)
{
f[i1][i2][i3][i4][i5]=get();
for(int i=1;i<=n;i++)
{
change(i);
}
}
}
}
}
}
printf("%d\n",f[need[1]][need[2]][need[3]][need[4]][need[5]]);
return 0;
}
usaco shopping 模拟+dp
最新推荐文章于 2024-11-21 11:59:55 发布
本文介绍了一种解决购物问题的算法实现,通过动态规划的方法来寻找购买一系列商品的最佳方案,以满足特定需求的同时达到最低成本。
85

被折叠的 条评论
为什么被折叠?



