| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 539 人关注过本帖, 1 人收藏
标题:hdu 2191
只看楼主 加入收藏
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
结帖率:95.65%
收藏(1)
已结贴  问题点数:20 回复次数:5 
hdu 2191
Input
输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(1<=n<=100, 1<=m<=100),分别表示经费的金额和大米的种类,然后是m行数据,每行包含3个数p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分别表示每袋的价格、每袋的重量以及对应种类大米的袋数。
 

Output
对于每组测试数据,请输出能够购买大米的最多重量,你可以假设经费买不光所有的大米,并且经费你可以不用完。每个实例的输出占一行。
 

Sample Input
1
8 2
2 100 4
4 100 2
 

Sample Output
400


不知道自己代码为啥不能ac~~~泪崩~~,问啥水题都过不鸟,在网上下载别人的代码,带入多组数据,结果都一样,就是不ac~~~help~~
一下是我的代码
程序代码:
#include <stdio.h>
typedef struct bag{
    int p;
    int w;
    int num;
    double p_w;
}bagclass;
#define MAXN 1000
bagclass A[MAXN];

//快排接口 
int partition(bagclass A[],int st, int ed){
    bag key = A[st];
    int j = st;
    for(int i = st + 1; i <= ed; i++){
        if(A[i].p_w <= key.p_w){
            j++;
            bag temp = A[i];
            A[i] = A[j];
            A[j] = temp;
        }
    }
    bag temp = A[j];
    A[j] = A[st];
    A[st] = temp;
    return j;
}
void quicksort(bag A[],int st, int ed){
    if(st < ed){
        int mid = partition(A,st,ed);
        quicksort(A,mid + 1, ed);
        quicksort(A,st,mid - 1);
    }
}
//快排接口
 

 
int main(){
    int testcase;
    int n,m;
    while(scanf("%d",&testcase) != EOF){
        for(int i = 0 ; i < testcase ; i++){
            scanf("%d%d",&n,&m);
            for(int j = 0; j < m ;j++){//input 
                scanf("%d%d%d",&A[j].p,&A[j].w,&A[j].num);
                A[j].p_w = A[j].p * 0.1 / A[j].w;
            }
            quicksort(A,0,m - 1); //快排 
            int sum_v = 0;
            int sum_w = 0;
            for(int i = 0; i < m ;i++){
                if(sum_v + A[i].p * A[i].num <= n){
                    sum_w += A[i].num * A[i].w;
                    sum_v += A[i].p * A[i].num;
                }
            }
            printf("%d\n",sum_w);
        }
    }
    return 0;
}
搜索更多相关主题的帖子: 正整数 
2013-04-05 18:44
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:0 

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2013-04-05 18:55
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:0 

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2013-04-05 19:07
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:0 
help...

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2013-04-05 19:17
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
这题贪心得不到最优解,用背包吧。这是我的AC代码,你可以参考一下。

程序代码:
#include<stdio.h>
int f[2001][101];
int cal(int * p, int * h, int n, int a)
{
    int i, j, d;
    for(i = 1; i < a; i++)
    for(j = 1; j <= n; j++)
    f[i][j] = f[i - 1][j] > (d = p[i] > j ? 0 : h[i] + f[i - 1][j - p[i]]) ? f[i - 1][j] : d;
    return f[a - 1][n];
}
   
int main()
{
    int p[2001], h[2001], c, n, m, a, i, j, tp, th, tc;
    for(scanf("%d", &c); c--; printf("%d\n", cal(p, h, n, a)))
    for(scanf("%d%d", &n, &m), a = 1, i = 0; i < m; i++)
    for(scanf("%d%d%d", &tp, &th, &tc), j = 0; j < tc; j++, a++)
        p[a] = tp, h[a] = th;
    return 0;
}

重剑无锋,大巧不工
2013-04-05 20:51
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:0 
回复 5楼 beyondyf
刚看到贪心算法~就去找相关题目来写。原来找成了背包的了~~,背包是下一章的内容,还没看~~,先保存起来,看到背包在来做。
谢谢b版了,先收藏下来,到时再来看,现在也还不懂背包问题的原理。

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2013-04-05 21:52
快速回复:hdu 2191
数据加载中...
 
   



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

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