| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1900 人关注过本帖
标题:求助 dp问题 实在是想不出来
只看楼主 加入收藏
xiaohuo66
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2020-11-1
结帖率:88.89%
收藏
已结贴  问题点数:20 回复次数:10 
求助 dp问题 实在是想不出来
给定n个物品,每个物品有其价值和价格。要求你从中选择至少m个物品,最大化选择的物品的价值之和除以价格之和(即总的性价比)。

Input
第一行一个整数T(1 <= T <= 10),表示数据组数。接下来T组数据:

对于每组数据,第一行两个整数n和m(1 <= m <= n <= 10000),表示物品个数和需要选择的个数。

接下来n行,第i行两个整数Ai和Bi(1 <= Ai,Bi <= 1e8),Ai表示第i个物品的价值,Bi表示第i个物品的价格。

Output
对于每组数据,输出一行,格式为:"Case #K: ANS",其中K表示当前是第K组数据。ANS表示最大的性价比,要求保留小数点后两位小数("%.2f"格式输出即可)。

Sample Input
2

3 2

1000 10

1000 100

1 1

10 6

183 94

1626 3880

306 104

246 1408

969 1936

3456 1660

2161 192

1931 4821

15011 484

1205 25212

Sample Output
Case #1: 91.00

Case #2: 5.42
搜索更多相关主题的帖子: 数据 价格 表示 一行 价值 
2020-11-27 20:21
xiaohuo66
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2020-11-1
收藏
得分:0 
这应该是背包问题?
2020-11-27 20:36
xiaohuo66
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2020-11-1
收藏
得分:0 
回复 2楼 xiaohuo66
二分答案??
2020-11-28 10:06
xiaohuo66
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2020-11-1
收藏
得分:0 
回复 2楼 xiaohuo66
贪心+二分??
最大得选 考虑bi小的??
2020-11-28 10:09
xiaohuo66
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2020-11-1
收藏
得分:0 
回复 5楼 xiaohuo66
没看懂 他不是让求的sum价值/sum价格吗 不能用单一的来表示吧
2020-11-28 10:38
xiaohuo66
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2020-11-1
收藏
得分:0 
回复 5楼 xiaohuo66
您这样贪心明显不过样例吧
2020-11-28 10:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 6楼 xiaohuo66
按性价比确实不行,
100/10,90/100,8/10 性价比从高到底
但 (100+8)/(10+10) 大于 (100+90)/(10+100)
2020-11-28 12:14
xiaohuo66
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2020-11-1
收藏
得分:0 
回复 6楼 xiaohuo66
#include <stdio.h>
#include <math.h>
#define max(a,b) a<b?b:a
float a[10005];
float b[10005];
float c[10005];
void Swap(int *p, int *q)
{
    int buf;
    buf = *p;
    *p = *q;
    *q = buf;
    return;
}

void QuickSort(int *a, int low, int high)
{
    int i = low;
    int j = high;
    int key = a[low];
    if (low >= high) //如果low >= high说明排序结束了
    {
        return ;
    }

    while (low < high) //该while循环结束一次表示比较了一轮
    {
        while (low < high && key <= a[high])
        {
            --high; //向前寻找
        }
        if (key > a[high])
        {
            Swap(&a[low], &a[high]);
            ++low;
        }
        while (low < high && key >= a[low])
        {
            ++low; //向后寻找
        }
        if (key < a[low])
        {
            Swap(&a[low], &a[high]);
            --high;
        }
    }
    QuickSort(a, i, low-1); //用同样的方式对分出来的左边的部分进行同上的做法
    QuickSort(a, low+1, j); //用同样的方式对分出来的右边的部分进行同上的做法
}
int check(int mid,int n,int m)
{
    float sum = 0;
    for(int j = 1 ; j <= n ; j++)
    {
        c[j] = a[j] - mid*b[j];
    }
    QuickSort(c,c[1],c[n]);
    for(int j = 1 ; j <= m ; j++)
    {
        sum += c[j];
    }
    if(sum < 0)return 1;
    else return 0;
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int i = 1 ; i <= t ; i++)
    {
        int n,m;
        float r = -1,ans = 0;
        scanf("%d%d",&n,&m);
        for(int j = 1 ; j <= n ; j++)
        {
            scanf("%f%f",&a[j],&b[j]);
            r = max(a[j]/b[j],r);
        }
        printf("Case #%d: ",i);
        float l = 0,mid;
        while(r-l>0.001)
        {
            mid = (l+r)/2;
            if(check(mid,n,m))
            {
                l = mid;
            }
            else
            {
                r = mid;
            }
        }
        printf("%0.2f\n",mid);
    }
    return 0 ;
}


[此贴子已经被作者于2020-11-28 18:04编辑过]

2020-11-28 12:33
请输入密码
Rank: 2
等 级:论坛游民
威 望:5
帖 子:35
专家分:84
注 册:2020-11-19
收藏
得分:0 
当时看过算法是以背包重量+1递增弄的。大概意思就是知道重量为n的最大值是重量为(n-k)的最大值加k的价值的最大值。如果要求求出组合那就需要一个二维数组。然后回溯就行了。(印象中不能重复拿的也要用二维数组做重复标记,如果能重复拿那代码会简单很多)

当然算法代码我陌生,原地起稿弄得花很多时间精力,做不起做不起。当然模板网上也是大把大把的。
还有论坛有搜索功能。

市场告诉你在哪了,想吃瓜就自己争取去。

[此贴子已经被作者于2020-11-28 12:46编辑过]


Bug易改,码风难移。
有事离开,无事灌水。
2020-11-28 12:44
xiaohuo66
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2020-11-1
收藏
得分:0 
回复 9楼 请输入密码
这么大数据 动态规划肯定tle(超时) 这题最理想就是二分答案 代码我写在上面了 但是跟样例差点意思....
2020-11-28 12:51
快速回复:求助 dp问题 实在是想不出来
数据加载中...
 
   



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

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