码迷,mamicode.com
首页 > 其他好文 > 详细

uva11400

时间:2018-11-03 23:12:17      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:注意   第一个   str   i++   turn   最好   hid   数值   bre   

给出题目意思:设计一个照明系统,有n(n<=1000)种灯泡可供选择,不同种类的灯泡必须用不同的电源,同种灯泡用一个电源,每种灯泡用4个数值表示:电压值v(v<=132000),电源费用k(k<=1000),每个灯泡的费用c(c<=10)和所需灯泡的数量l(1<=l<=100)

为了省钱,可以把一些灯泡换成电压更高的另一种灯泡来节省电源的钱(但不能换成电压更低的灯泡)。你的任务是设计出最优方案的费用

 

首先可以明确一点是灯泡要么全换要么一个都不换,这种很好像,如果当前灯泡的费用小于电压高的灯泡,那么最好就是全换掉在把电源也省掉!如果大于的话那么就是全换了,看电源的钱能不能省出来,要么就是一点都不换

这样的话就满足了dp的最优子结构的条件,而且也很好找出状态,我觉得很最长上升子序列挺相似的

接下来是代码:

技术分享图片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=1100; 
 7 int n,s1[maxn];
 8 int dp[maxn];
 9 struct node{
10     int v,k,c,l;//灯泡电压   电源费用  每个灯泡的费用  灯泡数量 
11 };
12 node li[maxn];
13 
14 bool cmp(node a1,node b1){
15     return a1.v<b1.v;    
16 }
17 
18 int main(){
19     while(scanf("%d",&n)!=EOF){
20         if(n==0) break;
21         for(int i=1;i<=n;i++) scanf("%d%d%d%d",&li[i].v,&li[i].k,&li[i].c,&li[i].l);
22         sort(li+1,li+n+1,cmp);
23         s1[0]=0;
24         for(int i=1;i<=n;i++) s1[i]=s1[i-1]+li[i].l;//得到灯泡的数量 
25         dp[1]=0;
26         for(int i=1;i<=n;i++){
27             dp[i]=s1[i]*li[i].c+li[i].k;
28             for(int j=1;j<i;j++){
29                 dp[i]=min(dp[i],dp[j]+(s1[i]-s1[j])*li[i].c+li[i].k);
30             }
31         }
32         cout<<dp[n]<<endl;          
33     }
34     return 0;
35 }
View Code

 下面是我的一个错误代码,错误原因未注意边界条件设置

技术分享图片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=1100; 
 7 int n,s1[maxn];
 8 int dp[maxn];
 9 struct node{
10     int v,k,c,l;//灯泡电压   电源费用  每个灯泡的费用  灯泡数量 
11 };
12 node li[maxn];
13 
14 bool cmp(node a1,node b1){
15     return a1.v<b1.v;    
16 }
17 
18 int main(){
19     while(scanf("%d",&n)!=EOF){
20         if(n==0) break;
21         for(int i=1;i<=n;i++) scanf("%d%d%d%d",&li[i].v,&li[i].k,&li[i].c,&li[i].l);
22         sort(li+1,li+n+1,cmp);
23         s1[0]=0;
24         for(int i=1;i<=n;i++) s1[i]=s1[i-1]+li[i].l;
25         dp[1]=li[1].k+li[1].c*li[1].l;
26         for(int i=2;i<=n;i++){
27             dp[i]=dp[1]+(s1[i]-s1[1])*li[i].c+li[i].k;
28             for(int j=2;j<i;j++){
29                 dp[i]=min(dp[i],dp[j]+(s1[i]-s1[j])*li[i].c+li[i].k);
30             }
31         }
32         cout<<dp[n]<<endl;          
33     }
34     return 0;
35 }
View Code

 我觉得为什么会出现问题 ,原因是第一个没有漏解,而第二个漏解了!

uva11400

标签:注意   第一个   str   i++   turn   最好   hid   数值   bre   

原文地址:https://www.cnblogs.com/pandaking/p/9902264.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!