有一个照明系统需要用到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 <iostream> #include <cstring> #include <cstdio> #include <algorithm> #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; }