UVa - 11400 - Lighting System Design(线性动态规划)

本文介绍了一个关于灯泡替换的问题,通过动态规划算法找到最省钱的灯泡替换方案。使用C++实现,包括输入灯泡参数、计算总需求、排序及求解最优解等步骤。

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

题目意思是 小灯泡(低电压)可以换成大灯泡,但是需求的数目不变,一种灯泡只买一个电源就可以。

举个例子 灯泡a和b。
a 电压 1 电源 50元 单价 5 需要 5
b 电压 2 电源 20元 单价 6 需要 4
买小灯泡的话,需要50+5*5=75 加上大灯泡的20+4*6+75 = 119元
如果把小灯泡换成大灯泡,虽然单价大灯泡贵,但是就不用买小灯泡的电源,就需要20+(5+4)*6 = 74元

现在就是给了一些灯泡 ,求出最省钱的方案

设dp[ i ] 是前 i 个灯泡的最优解 ,dp [ i ] = max ( dp [ i ] , dp [ j ] + ( sum [ i ] - sum [ i ] ) * 单价);


#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1005
#define INF 1000000000 
using namespace std;

struct Lamp{
	int v,k,c,l;
}lamp[N];
bool cmp(Lamp p1 ,Lamp p2){
	return p1.v<p2.v;
}

int dp[N];
int sum[N];
int n;

int main(){
	while((scanf("%d",&n))!=EOF&&n){
		memset(dp,0,sizeof(dp));
	 	memset(sum,0,sizeof(sum));
		for(int i=1 ;i<=n ;i++){
			scanf("%d%d%d%d",&lamp[i].v,&lamp[i].k ,&lamp[i].c ,&lamp[i].l);
			sum[i] = sum[i-1]+lamp[i].l;
		}
		 
		sort(lamp+1,lamp+1+n,cmp);
		//排序后再计算sum
		//sum[i]表示前i种灯泡的需求数 
		for(int i=1 ;i<=n ;i++){
			sum[i] = sum[i-1]+lamp[i].l;
		}	  
		
		for(int i=1 ;i<=n ;i++){
			dp[i] =  INF;
			for(int j=0 ;j<i ;j++){
				/*
				 * 前j个是最优方案,将j~i全部换成大灯泡
				 * 其中 j 的范围是 0~i 
				 */ 
				 dp[i] = min(dp[i],dp[j]+((sum[i]-sum[j])*lamp[i].c)+lamp[i].k);	
			}
		}
		printf("%d\n",dp[n]);
	}
	
	return 0;
} 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值