| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4727 人关注过本帖
标题:求此题解解题思路最有附加代码
只看楼主 加入收藏
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
1    newbiecoder    8    561:19:25    04:58:10            05:38:30        241:37:01            03:33:07    19:29:16(-5)    24:30:52(-3)    240:40:29(-1)    17:12:00(-2)        
2    wxjeacen    5    1651:35:27    327:03:49            -3        309:34:20                349:28:21                332:28:36    333:00:21


1010 pass
2010-04-13 09:59
mywaylgh
Rank: 8Rank: 8
来 自:厨房
等 级:蝙蝠侠
威 望:5
帖 子:188
专家分:729
注 册:2010-3-10
收藏
得分:0 
天外有天,人外有人
谦虚最重要..........

恩,一个很好的dp问题。
代码如下,经运行良好,基本上可以结题了。
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define max_workers 100
#define MIN(a,b) (a>b?b:a)

int process_step(int *step,int **trace,const int *min_workers,const int *spend,int month)
{
    int i,j,k,step_min,tmp,trace_worker;
    for (i=min_workers[month];i<=max_workers ;i++ )
    {
        step_min = step[max_workers] + max_workers*spend[1] + (max_workers-i)*spend[2];
        trace_worker = max_workers;
        for (j=min_workers[month-1];j<=max_workers ;j++ )
        {
            if (i>j)
                tmp = step[j] + j*spend[1] + (i-j)*spend[0];
            else
                tmp = step[j] + j*spend[1] + (j-i)*spend[2];
            if (step_min>tmp)
            {
                step_min = tmp;
                trace_worker = j;
            }
        }
        step[i] = step_min;
        for (k=0;k<month ;k++ )
        {
            trace[i][k] = trace[trace_worker][k];
        }
        trace[i][month] = i;
    }
}

int main()
{
    // inputs.
    int month;
    int spend[3];

    scanf("%d\n",&month);

    if (month>12 || month<=0)
    {
        printf("Error in input month: month must be >0 and <=12!");
        exit(1);
    }

    scanf("%d %d %d\n",spend+0,spend+1,spend+2);

    int min_workers[month];
    int step[max_workers+1];
    int min_cost;
    int **trace;
    int i=0,kk;

    while(1)
    {
        scanf("%d",&kk);
        if (kk==0) break;
        min_workers[i++]=kk;
    }
    if (i!=month)
    {
        printf("Error in input min workers in each month!");
        exit(1);
    }
   
    // save dynamic programm traces
    trace = (int **)malloc((max_workers+1)*sizeof(int *));
    for (i=0;i<=max_workers ;i++ )
        trace[i] = (int *)malloc(month*sizeof(int));


    // initail worker
    for (i=min_workers[0];i<=max_workers ;i++ )
    {
        step[i] = spend[0]*i;
        trace[i][0]=i;
    }

    //dp process
    for (i=1;i<month ;i++ )
        process_step(step,trace,min_workers,spend,i);

    //make last step
    min_cost = step[min_workers[month-1]]+min_workers[month-1]*spend[1];
    for (i=min_workers[month-1] ;i<=max_workers;i++ )
    {
        if (min_cost>=step[i]+i*spend[1])
        {
            kk = i;
        }
        min_cost = MIN(min_cost,step[i]+i*spend[1]);
    }

    //print output
    printf("The min cost is %d\n",min_cost);
    printf("Each month workers is:  ");
    for (i=0;i<month ;i++ )
    {
        printf("%d\t",trace[kk][i]);
    }
}
    




[ 本帖最后由 mywaylgh 于 2010-4-13 15:51 编辑 ]

人生就像茶几 上面放着许多杯具

人生也像厨房 里面总有一些洗具
2010-04-13 15:37
mywaylgh
Rank: 8Rank: 8
来 自:厨房
等 级:蝙蝠侠
威 望:5
帖 子:188
专家分:729
注 册:2010-3-10
收藏
得分:0 
哦,忘记free了,大家如果copy代码的时候注意free一下trace

人生就像茶几 上面放着许多杯具

人生也像厨房 里面总有一些洗具
2010-04-13 15:38
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用mywaylgh在2010-4-13 15:37:01的发言:

天外有天,人外有人
谦虚最重要..........

恩,一个很好的dp问题。
代码如下,经运行良好,基本上可以结题了。
#include <stdio.h>
#include <stdlib.h>
#define max_workers 100
#define MIN(a,b) (a>b?b:a)

int process_step(int *step,int **trace,const int *min_workers,const int *spend,int month)
{
    int i,j,k,step_min,tmp,trace_worker;
    for (i=min_workers[month];i<=max_workers ;i++ )
    {
        step_min = step[max_workers] + max_workers*spend[1] + (max_workers-i)*spend[2];
        trace_worker = max_workers;
        for (j=min_workers[month-1];j<=max_workers ;j++ )
        {
            if (i>j)
                tmp = step[j] + j*spend[1] + (i-j)*spend[0];
            else
                tmp = step[j] + j*spend[1] + (j-i)*spend[2];
            if (step_min>tmp)
            {
                step_min = tmp;
                trace_worker = j;
            }
        }
        step = step_min;
        for (k=0;k<month ;k++ )
        {
            trace[k] = trace[k];
        }
        trace[month] = i;
    }
}

int main()
{
    // inputs.
    int month;
    int spend[3];

    scanf("%d\n",&month);

    if (month>12 || month<=0)
    {
        printf("Error in input month: month must be >0 and <=12!");
        exit(1);
    }

    scanf("%d %d %d\n",spend+0,spend+1,spend+2);

    int min_workers[month];
    int step[max_workers+1];
    int min_cost;
    int **trace;
    int i=0,kk;

    while(1)
    {
        scanf("%d",&kk);
        if (kk==0) break;
        min_workers=kk;
    }
    if (i!=month)
    {
        printf("Error in input min workers in each month!");
        exit(1);
    }
   
    // save dynamic programm traces
    trace = (int **)malloc((max_workers+1)*sizeof(int *));
    for (i=0;i<=max_workers ;i++ )
        trace = (int *)malloc(month*sizeof(int));


    // initail worker
    for (i=min_workers[0];i<=max_workers ;i++ )
    {
        step = spend[0]*i;
        trace[0]=i;
    }

    //dp process
    for (i=1;i<month ;i++ )
        process_step(step,trace,min_workers,spend,i);

    //make last step
    min_cost = step[min_workers[month-1]]+min_workers[month-1]*spend[1];
    for (i=min_workers[month-1] ;i<=max_workers;i++ )
    {
        if (min_cost>=step+i*spend[1])
        {
            kk = i;
        }
        min_cost = MIN(min_cost,step+i*spend[1]);
    }

    //print output
    printf("The min cost is %d\n",min_cost);
    printf("Each month workers is:  ");
    for (i=0;i<month ;i++ )
    {
        printf("%d\t",trace[kk]);
    }
}
   


我就不想抨击你了。

等你ac了再贴代码吧。。

你的代码编译都不过。。。

[ 本帖最后由 Devil_W 于 2010-4-13 16:21 编辑 ]
2010-04-13 16:16
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
Rank    Team    Solved    Penalty    1001    1002    1003    1004    1005    1006    1007    1008    1009    1010    1011    1012    1013    1014    1015
1    newbiecoder    8    561:19:25    04:58:10            05:38:30        241:37:01            03:33:07    19:29:16(-5)    24:30:52(-3)    240:40:29(-1)    17:12:00(-2)        
2    wxjeacen    7    2352:27:24    327:03:49            349:38:36(-3)        309:34:20                349:28:21        350:13:21        332:28:36    333:00:21
3    草狼    5    910:37:02    18:30:34(-4)            -11        300:57:42(-8)            04:57:24(-3)            352:25:53(-15)    221:25:29(-7)    -1   


我可是ac了。
2010-04-13 16:18
mywaylgh
Rank: 8Rank: 8
来 自:厨房
等 级:蝙蝠侠
威 望:5
帖 子:188
专家分:729
注 册:2010-3-10
收藏
得分:0 
Devil_W
严重怀疑你来此论坛的目的,看起来牛气冲冲的......
标准gcc编译的
如果你在用自己写的编译器编译的话,我就无话可说了
那贴windows版本的可执行文件和ubuntu的bin文件吧
自己去试一下,不要动不动就乱说
那个1004要用java 编...可惜我不会java


D:\c_sources_bak\bbs>dp
4
4 3 6
12 10 9 11
0
The min cost is 189
Each month workers is:  12      11      11      11

你的程序运行是:192

明显你的错了,还在这觉得自己很厉害很强大,瞧不起任何人.....

ps:我只是个菜鸟,学c也就几个月,本着虚心学习的态度来这个论坛...
现在就觉得你让我最看不顺眼
dp.rar (10.09 KB)


人生就像茶几 上面放着许多杯具

人生也像厨房 里面总有一些洗具
2010-04-13 16:49
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用mywaylgh在2010-4-13 16:49:00的发言:

Devil_W
严重怀疑你来此论坛的目的,看起来牛气冲冲的......
标准gcc编译的
如果你在用自己写的编译器编译的话,我就无话可说了
那贴windows版本的可执行文件和ubuntu的bin文件吧
自己去试一下,不要动不动就乱说
那个1004要用java 编...可惜我不会java


D:\c_sources_bak\bbs>dp
4
4 3 6
12 10 9 11
0
The min cost is 189
Each month workers is:  12      11      11      11

你的程序运行是:192

明显你的错了,还在这觉得自己很厉害很强大,瞧不起任何人.....

ps:我只是个菜鸟,学c也就几个月,本着虚心学习的态度来这个论坛...
现在就觉得你让我最看不顺眼



我根本就没有看不起谁的意思。

是你一上来就对我进行评论。我得罪你了?

那个1004不是要用java来写的。

你没看到选项是vc++?

别拿gcc来说什么,我是linuxer, 那玩意我用的比你熟练。

技不如人的时候,低调点会怎么样啊!!!
2010-04-13 17:00
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#define min(x,y) (x)>(y)?(y):(x)
#define maxn 300
#define inf INT_MAX
int dp[14][maxn];
int main()
{
    int n,h,s,f,max,min,q,tmp;
    int a[14],k,i,j,mmax;
    while(scanf("%d",&n),n)
    {
        //max=-;
        min=inf;
        mmax=inf;
        for(i=0;i<13;i++)
        for(j=0;j<300;j++)
        dp[i][j]=inf;
        scanf("%d%d%d",&h,&s,&f);
        for(i=0;i<n;i++)
        {scanf("%d",&a[i]);}
        max=a[0];
        dp[0][max]=a[0]*h+a[0]*s;
        min=max;
        
        
        //printf("--%d\n",dp[0][max]);
        for(i=1;i<n;i++)
        {
            for(int p=max;p>=min;p--)
            {
                if(p>=a[i])
                {
                    for(q=p;q>=a[i];q--)
                    {
                        dp[i][q]=min(dp[i][q],(dp[i-1][p]+(p-q)*f+q*s));
            //    printf("%d\n",dp[i][q]);
                    }
                }
                else
                {
                    for(q=p;q<=max;q++)
                    {
                        if(q>=a[i])
                dp[i][q]=min(dp[i][q],(dp[i-1][p]+(q-p)*h+q*s));
            else
            {
                dp[i][a[i]]=min(dp[i][a[i]],(dp[i-1][p]+(a[i]-p)*h+a[i]*s));        
            }
                    }
                    //dp[i][a[i]]=min(dp[i][a[i]],(dp[i-1][p]+(a[i]-p)*h+q*s));
                    //dp[i][a[i]]=min(dp[i][a[i]],(dp[i-1][p]+(a[i]-p)*h+a[i]*s));
                }
        }
            if(max<a[i])max=a[i];
            if(a[i]<min)min=a[i];
        }
    //for(i=0;i<n;i++)
        for(j=a[n-1];j<=max;j++)
           {mmax=min(mmax,dp[n-1][j]);}
        printf("%d\n",mmax);
    }
    return 0;
} 



把我的source code 贴进去看看能不能ac.

我都不想再争执了。

[ 本帖最后由 Devil_W 于 2010-4-13 17:05 编辑 ]
2010-04-13 17:03
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用mywaylgh在2010-4-13 16:49:00的发言:

Devil_W
严重怀疑你来此论坛的目的,看起来牛气冲冲的......
标准gcc编译的
如果你在用自己写的编译器编译的话,我就无话可说了
那贴windows版本的可执行文件和ubuntu的bin文件吧
自己去试一下,不要动不动就乱说
那个1004要用java 编...可惜我不会java


D:\c_sources_bak\bbs>dp
4
4 3 6
12 10 9 11
0
The min cost is 189
Each month workers is:  12      11      11      11

你的程序运行是:192

明显你的错了,还在这觉得自己很厉害很强大,瞧不起任何人.....

ps:我只是个菜鸟,学c也就几个月,本着虚心学习的态度来这个论坛...
现在就觉得你让我最看不顺眼



2_5876_380412_27783.cpp
2_5876_380412_27783.cpp(50) : error C2057: 应输入常数表达式
2_5876_380412_27783.cpp(50) : error C2466: 不能分配常数大小为 0 的数组
2_5876_380412_27783.cpp(50) : error C2133: “min_workers” : 未知的大小

你开看得懂他的编译器给你报的什么错?
2010-04-13 17:06
mywaylgh
Rank: 8Rank: 8
来 自:厨房
等 级:蝙蝠侠
威 望:5
帖 子:188
专家分:729
注 册:2010-3-10
收藏
得分:0 
Devil_W
我写程序可能并不是高手,但几个软件还是写过的,是linux下,windows下都能用的...
不知道你所谓的熟练是什么意思?
还有你怎么知道我不是linuxer?
ubuntu不是linux?
我用ubuntu有3年了。
vc++我没用过,因为我是做生物计算的,大部分程序都需要跨平台,跨操作系统,所以只用gcc/g++编译。
我说谦虚点是因为一般厉害的人不会在一些小问题上(就如你和我现在做的这些作业)花太多的时间。
有时间去开源社区开发一些软件什么的不是更有意义?

你既然来这个论坛了 就不要瞧不起 新人,因为我也曾经是新人,而且没上过一节计算机课,全是自学
知道新人从什么都不懂到所谓的菜鸟的艰辛
你要觉得自己很牛x,就去那些开源社区,csdn啊这些地方做点实在的事情,写一些好用的开源的软件,
或者把自己的心得写下来让我们这些菜鸟也学学,何必每次都高高在上的和其它人说话呢?




人生就像茶几 上面放着许多杯具

人生也像厨房 里面总有一些洗具
2010-04-13 17:16
快速回复:求此题解解题思路最有附加代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046623 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved