Uva 11400 照明系统
2019-07-14 02:38发布
生成海报
有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L。注意到,电压相同的灯泡只需要共享一个对应的电源即可,还有电压低的灯泡可以被电压高的灯泡替代。为了节约成本,你将设计一种系统,使之最便宜。
每种灯泡要么全换 要么不换,若只换一部分则需要两个电源,划不来。
先把照明电压从小到大排序,y表示前i种灯泡的数量总和
dp[i] = min(dp[i],dp[j]+(pnode[i].y-pnode[j].y)*pnode[i].x + pnode[i].k);
(前j个用最优方案,再把 j+1~i 全用i替换) => 最优解dp[n]
#include
#include
#include
#include
#define MAX 110
using namespace std;
struct node
{
int v;
int k;
int x;
int y;
}pnode[1005];
bool cmp(node a,node b)
{
return a.v < b.v;
}
int dp[1005];
int main()
{
int n;
while(scanf("%d",&n) && n)
{
memset(pnode,0,sizeof(pnode));
for(int i = 1;i <= n;i++)
{
scanf("%d%d%d%d",&pnode[i].v,&pnode[i].k,&pnode[i].x,&pnode[i].y);
}
sort(pnode+1,pnode+n+1,cmp);
for(int i = 1;i <= n;i++)
pnode[i].y += pnode[i-1].y;
memset(dp,0,sizeof(dp));
for(int i = 1;i <= n;i++)
for(int j = 0;j < i;j++)
{
if(j == 0)
dp[i] = pnode[i].x*pnode[i].y + pnode[i].k;
else
dp[i] = min(dp[i],dp[j]+(pnode[i].y-pnode[j].y)*pnode[i].x + pnode[i].k);
}
printf("%d
",dp[n]);
}
return 0;
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮