Q1.对于将第a种灯泡替换为第b种灯泡,为什么将第a种全部替换比将第a种部分替换更优?
这个问题并不是像主流所说,可以证明部分替换比全部替换更优,这个无法证明,设第a种灯泡的电源费用为V,如果此时a的单价大于等于b的单价,那么易知全部将a替换后一定更省钱,但是,如果a的单价小于b的单价,不一定全部更换省钱,此处可用简单的函数作差说明
那为什么要全部更换呢?因为题目里有如下描述,But the accounts section of your company soon figures out that they might be able to reduce the total system cost by eliminating some of the voltage sources and replacing the lamps of that category with higher rating lamps.可见,题目要求的操作是删去一些电源,然后将那种电源对应的灯泡换成更高电压的灯泡,所以必须全部更换
Q2. 当dp过程进行到第i种灯泡时,为什么将第 j 到 i 种全部更换成第 i 种 (j<i),而没有考虑将第j种替换为第i种,第j+1到第i种不全部替换为第i种的情况
此处对于解题者应该先猜后证,因为个人认为证明不太好想。
反证法:
设此时将第j种替换为了第i种 ( j<=i-2),而第j+1种没有替换为第i种,(他也不能被替换成其他种),保持其自身
假设这种情况,比将第j+1种也替换为第i种更加划算,此时第j+1种要么需要增加第j+1种电源的费用,要么已经使用了其他的电压更高的电源则电源费用不变,总之,电源的费用是不减少的,那么总费用要减少
第j+1种的单价必须小于第i种的单价。此时,将第j种替换为第j+1种,比将其替换为第i种更加划算
因此,这种方案被将 j 替换为第j+1的方案取代,而这种方案是我们计算过的
最后贴一下代码,欢迎讨论
#include<iostream>
#include<cstdio>
#include<algorithm> //include sort() min()
using namespace std;
int n,dp[1005],s[1005];
struct lamp{
int v,k,c,l;
bool operator < (const lamp& rhs) const{
return v<rhs.v;
} //Overload Function to change the accordings of sort to v
}lmp[1005];
int main()
{
while(cin>>n && n)
{
for(int i=1;i<=n;i++)
cin>>lmp[i].v>>lmp[i].k>>lmp[i].c>>lmp[i].l;
sort(lmp+1,lmp+1+n);
s[0]=0;
for(int i=1;i<=n;i++)
s[i]=s[i-1]+lmp[i].l;
dp[0]=0;
for(int i=1;i<=n;i++)
{
dp[i]=s[i]*lmp[i].c+lmp[i].k;
for(int j=1;j<=i-1;j++)
{
dp[i]=min(dp[i],dp[j]+(s[i]-s[j])*lmp[i].c+lmp[i].k);
}
}
cout<<dp[n]<<endl;
}
return 0;
}