Chinaunix首页 | 论坛 | 博客
  • 博客访问: 436531
  • 博文数量: 103
  • 博客积分: 5010
  • 博客等级: 大校
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-11 17:22
文章分类
文章存档

2008年(77)

2007年(26)

我的朋友

分类: C/C++

2008-03-22 00:11:00

每一个状态b,表示最后的产品的B值就是b,所以,只要考虑把满足状态b的所有选择中的p值最小的部件
选出来就可以了。那么总的P值也一定是最小的,最后的B/P值一定是最大的。

算法实现:
for(i=0;i<总共的状态数;i++)
{ for (j=0;j<总的部件数;j++)
{ for(k=0;k<总的选择;k++)
求出满足状态i的,p值最小的部件;
total+=求出来的p;
}
比较求出最大的B[i]/ total 的值;
}

效率分析:
总状态数*部件数*每个部件的选择数


解题总结:
动态规划要灵活运用

在有两个属性值的情况下,必须要固定一个求另一个,同时规划两个值的最优是不可行的。

找清状态,通常可能做状态的是:属性值,或者属性值的差,和,积(如jury)

状态转换不一定非要用二维数组自底向上去推

#include <stdio.h>
#include <stdlib.h>

#define MAX 100
struct bp_node{
        int b;
        int p;
}bp[MAX][MAX];

int m;
int num[MAX];
int b[MAX*MAX];
int cb;

static int compare(const void *x, const void *y);
static void input_init(void);
static void work(void);
int main(int argc, char **argv)
{
        int tests;

        scanf("%d ", &tests);
        while(tests--){
                input_init();
                work();
        }
        exit(0);
}


static int compare(const void *x, const void *y)
{
        return (*((int *)x) - *((int *)y));
}

static void input_init(void)
{
        int i, j;

        scanf("%d", &m);
        getchar();
        for(i = 0; i < m; i++){
                scanf("%d ", &num[i]);
                for(j = 0; j < num[i]; j++){
                        scanf("%d %d", &bp[i][j].b, &bp[i][j].p);
                        b[cb++] = bp[i][j].b;
                }
                getchar();
        }
        qsort(b, cb, sizeof(b[0]), compare);
}

static void work(void)
{
        int i, j, k, s, total;
        float max = 0.0;

        for(i = 0; i < cb; i++){
                if(b[i] == b[i+1]){
                        continue;
                }
                total = 0;
                for(j = 0; j < m; j++){
                        s = 32767;
                        for(k = 0; k < num[j]; k++){
                                if((bp[j][k].b >= b[i]) && (bp[j][k].p <= s)){
                                        s = bp[j][k].p;
                                }
                        }
                        total += s;
                }
                if(max < (float)b[i]/total){
                        max = (float)b[i]/total;
                }
        }
        printf("%.3f\n", max);
}

阅读(838) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-09-26 16:46:07

这是那个啊?具体一点,那个oj上的!