| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1365 人关注过本帖
标题:OJ最大贡献问题
只看楼主 加入收藏
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
结帖率:56.25%
收藏
已结贴  问题点数:6 回复次数:5 
OJ最大贡献问题
题目:
Description
蒙多最近运气太好了- -,对面怒送一血,抢大龙,小龙,然后各种五杀(蒙多都能五杀,运气不能更好),瞬间超神,小小的钱袋里一下子有好多钱,好开心~,但是他在纠结该买些什么装备才能对团队贡献大,所以他跑来请教你。as we know ,在游戏里我们最多同时拥有6件装备,所以蒙多不能购买超过6件装备。现在有N种不同的装备供蒙多选择,蒙多手上有M单位的钱,每种装备最多只能买一个,每件装备有不同的价格Ai,对团队的贡献度为Bi,请帮助蒙多购买装备使得他对团队贡献值总和最大。



Input
输入包括多组数据,以文件(EOF)结束。
第一行两个整数N(1<=N<=100),M(1<=M<=1000)。
接下来N行,每行两个整数Ai(1<=Ai<=100),Bi(1<=Bi<=1000)。



Output
每组数据一个整数,表示最大贡献度。



Sample Input
Original Transformed

1 5
6 2
3 5
3 3
5 4
4 1

1[SP]5[EOL] 6[SP]2[EOL] 3[SP]5[EOL] 3[SP]3[EOL] 5[SP]4[EOL] 4[SP]1[EOL] [EOL] [EOF]

Sample Output
Original Transformed

0
4

我的代码是:
程序代码:
#include<stdio.h>
int main()
{
    int num, mon, choice[100][2];
    while (scanf("%d", &num) == 1 && num != EOF)
    {
        int sum = 0;
        char ch = getchar();
        scanf("%d", &mon);
        ch = getchar();
        for (int i = 0;i < num;i++)
            scanf("%d%d", &choice[i][0], &choice[i][1]);
        for (int i = 0,t,p;i < num-1;i++)
        {
            for (int j = 0;j < num-1-i;j++)
            {
                if (choice[j][0]>choice[j+1][0])
                {
                    t = choice[j][0];
                    p = choice[j][1];
                    choice[j][1] = choice[j+1][1];
                    choice[j][0]=choice[j+1][0];
                    choice[j+1][0] = t;
                    choice[j+1][1] = p;
                }
            }
        }
        for (int i,all,max,j=0,k;j < num;j++)
        {
            all = max=k=0;
            i = j;
            while (i<num&&k<6)
            {
                all += choice[i][0];
                if (all > mon)break;
                max += choice[i][1];
                k++;
                i++;
            }
            if (sum < max)sum = max;
        }
        printf("%d\n", sum);
    }
    return 0;
}

是错误答案,为什么?结果都是对的,我做过其他数据测试,也没有问题
搜索更多相关主题的帖子: 购买装备 游戏 
2016-03-06 17:29
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:3 
应该是输入输出格式不对。首先num,mon要一起输入,scanf("%d%d", &num, &mon) == 2 && num != EOF && mon != EOF; 再次,结果要统一在最后输出,不是计算一组数据输出一个结果。

[此贴子已经被作者于2016-3-6 17:50编辑过]


   唯实惟新 至诚致志
2016-03-06 17:48
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:3 
这是一个背包的题,通常用什么贪心算法。楼主简单的几个循环肯定是完成不了的。简单实验了如下数据,楼主的代码得到的就是错误答案:
3 9
3 3
5 4
4 1
楼主答案:5  正确答案:7,尽管选择这个还有1块钱没花出去,但贡献最大。
从输入上说,这种用法不是判断EOF的用法,但仍然能接受^Z退出循环,实验时好像问题不大,但终归可能和题意不合,不一定能AC

能编个毛线衣吗?
2016-03-06 18:09
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
收藏
得分:0 
回复 2楼 qq1023569223
然后出现runtime error,怎么回事?

计算机专业的大学生
2016-03-06 18:11
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
给楼主一个提示:每次选择性价比最高的,通常最接近正确答案。如果要完全正确,通常使用组合算法,再在组合里筛选。如9套装备供选择,你做9选1-6的组合(9选1、9选2...9选6)

[此贴子已经被作者于2016-3-6 18:19编辑过]


能编个毛线衣吗?
2016-03-06 18:16
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
收藏
得分:0 
回复 3楼 wmf2014
我改成这样,做很多测试都没有问题,还是错,求解
程序代码:
#include<stdio.h>
int main()
{
    int num, mon, choice[100][2];
    while (scanf("%d%d", &num,&mon) == 2 && num != EOF&&mon!=EOF)
    {
        int sum = 0;
        char ch = getchar();
        for (int i = 0;i < num;i++)
            scanf("%d%d", &choice[i][0], &choice[i][1]);
        for (int i = 0,t,p;i < num-1;i++)
        {
            for (int j = 0;j < num-1-i;j++)
            {
                if (choice[j][1]<choice[j+1][1])
                {
                    t = choice[j][0];
                    p = choice[j][1];
                    choice[j][1] = choice[j+1][1];
                    choice[j][0]=choice[j+1][0];
                    choice[j+1][0] = t;
                    choice[j+1][1] = p;
                }
            }
        }
        for (int i,all,max,j=0,k;j < num;j++)
        {
            all = max=k=0;
            i = j;
            while (i<num&&k<6)
            {
                all += choice[i][0];
                if (all > mon)break;
                max += choice[i][1];
                k++;
                i++;
            }
            if (sum < max)sum = max;
        }
        printf("%d\n", sum);
    }
    return 0;
}

计算机专业的大学生
2016-03-08 17:42
快速回复:OJ最大贡献问题
数据加载中...
 
   



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

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