| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1144 人关注过本帖, 1 人收藏
标题:贪婪技术
只看楼主 加入收藏
msshadow
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2007-5-30
收藏(1)
 问题点数:0 回复次数:5 
贪婪技术
一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集S。关于S 的一个时间表用于描述S 中单位时间任务的执行次序。时间表中第1 个任务从时间0 开始执行直至时间1 结束,第2 个任务从时间1 开始执行至时间2 结束,…,第n个任务从时间n-1 开始执行直至时间n结束。
具有截止时间和误时惩罚的单位时间任务时间表问题可描述如下。
(1) n 个单位时间任务的集合S={1,2,…,n};
(2) 任务i的截止时间di ,1≤i≤n,1≤ di ≤n,即要求任务i 在时间di 之前结束;
(3) 任务i 的误时惩罚wi ,1≤i≤n,即任务i 未在时间di 之前结束将招致wi 的惩罚;若按时完成则无惩罚。
任务时间表问题要求确定S 的一个时间表(最优时间表)使得总误时惩罚达到最小。
给定n 个单位时间任务,各任务的截止时间di ,各任务的误时惩罚wi ,1≤i≤n,编程计算最优时间表。

[bold]Input [/bold]第一行是正整数n,表示任务数。接下来的2行中,每
行有n个正整数,分别表示各任务的截止时间和误时惩罚。

[bold]Output [/bold]最小总误时惩罚

[bold]Sample Input [/bold]

7
4 2 4 3 1 4 6
70 60 50 40 30 20 10


[bold]Sample Output [/bold]

50

搜索更多相关主题的帖子: 任务 贪婪 时间表 单位 技术 
2007-12-04 15:12
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
贪心+DP,不知道有没有更好的算法
程序代码:
#include <iostream>
using namespace std;

/*
f[i][j]=min{ f[i+1][j]+b[i], if(j<a[i])f[i+1][j+1] };
f[n][*]=0;
*/

int _f[2][1000000];

struct {
    int* operator [] (int i){
        return _f[i&1];
    }    
}f;    

struct Node {
    int a;
    int b;
}arr[1000000];

bool operator < (const Node& a,const Node& b){
    return a.a<b.a;
}    

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%d",&arr[i].a);
        }    
        for(int i=0;i<n;i++){
            scanf("%d",&arr[i].b);
        }    
        sort(arr,arr+n);
        for(int j=0;j<=n+1;j++){
            f[n][j]=0;
        }    
        for(int i=n-1;i>=0;i--){
            for(int j=n;j>=0;j--){
                f[i][j]=f[i+1][j]+arr[i].b;
                if(j<arr[i].a)f[i][j]<?=f[i+1][j+1];
            }
        }
        printf("%d\n",f[0][0]);
    }    
}    
2007-12-04 20:34
msshadow
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2007-5-30
收藏
得分:0 
回复 2# 的帖子
首先,感谢leeco的帮助,但是我的的编译器确通不过啊,你用的是什么编译器呢?
#include<iostream.h>
#include <stdlib.h>
int m;
int a[100]={0},b[100]={0};
int f[10000][10000];
int Compare(const void *elem1, const void *elem2)
{
    return *((int *)(elem1)) - *((int *)(elem2));
}

int main()
{
    int i,j;
    int sum=0;
    cin>>m;
    for(i=0;i<m;i++)
        cin>>a[i];
    for(i=0;i<m;i++)
        cin>>b[i];
    qsort(b, m, sizeof(int), Compare);
    for(j=0;j<=m+1;j++)
    {
        f[m][j]=0;
    }  
    for( i=m-1;i>=0;i--)
    {
        for( j=m;j>=0;j--)
        {
            f[i][j]=f[i+1][j]+b[i];
            if(j<a[i])
            {
                if(f[i][j]<f[i+1][j+1])
                    f[i][j]=f[i+1][j+1];
            }
        }
    }
    cout<<f[0][0];    
    return 0;
}
看看我改的程序呢?
2007-12-12 12:14
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
回复 3# 的帖子
我用的G++
2007-12-12 16:48
Jason-xl
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-12-11
收藏
得分:0 
二楼的好像是C语言~
2007-12-12 18:20
msshadow
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2007-5-30
收藏
得分:0 
回复 4# 的帖子
知道了,我在devC++里通过了...谢谢了..
2007-12-16 22:26
快速回复:贪婪技术
数据加载中...
 
   



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

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