题目链接:https://vjudge.net/problem/UVA-11400
紫书P275
题意:输入为电压、电源费用、灯泡单价、所需灯泡数量。电压低得灯泡可以被电压高的灯泡替换,求最小花费。
思路: 每种灯泡要么全换,要么全不换。 如果将一部分灯泡换成电压高单价低的灯泡,还需要花费电源钱,如果全部更换则不需要额外花费电源。先按照电压排序。dp【i】表示到第i种灯泡所需的最小花费。还要确定一点就是每次用一种灯泡代替另一种灯泡时,一定是连续替换的,不可能跳过某一种而更换下一种。比如1 2 3 4 ,枚举到5,用5替换了4则不可能跳过3替换2,如果没有替换3,那么说明3比5更好,也就是2已经被3替换,因而5不可能跳过3更换2.
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
struct node
{
int v,k,c,l;
bool operator <(node &r)
{
return v<r.v;
}
} nd[1005];
int dp[1005],s[1005];
int main()
{
int t;
int ans;
while(cin>>t&&t)
{
memset(s,0,sizeof(s));
memset(dp,0x3f,sizeof(dp));
for(int i=1; i<=t; i++)
{
scanf("%d%d%d%d",&nd[i].v,&nd[i].k,&nd[i].c,&nd[i].l);
}
sort(nd+1,nd+t+1);
for(int i=1; i<=t; i++)
{
s[i]=s[i-1]+nd[i].l;
}
dp[0]=0;
for(int i=1; i<=t; i++)
{
for(int j=i-1; j>=0; j--)
{
dp[i]=min(dp[i],dp[j]+(s[i]-s[j])*nd[i].c+nd[i].k);
}
}
cout<<dp[t]<<endl;
}
return 0;
}