洛谷p2240部分部分背包问题c语言(数组实现)

部分背包问题网上都是c++实现,而且使用结构体,这里给小白提供一种c语言方法,并且不需要结构体,只需要数组便可以

​
#include <stdio.h>
int main()
{
    double a[100][2] = { 0 };
    int n = 0;
    double pp = 0, qq = 0, ss = 0;
    double t = 0;
    double ave[100] = { 0 };
    scanf("%d %lf", &n, &t);//输入金币箱数和背包能够承受的总重量
    for (int i = 0; i < n; i++)
    {
        scanf("%lf %lf", &a[i][0], &a[i][1]);//输入每箱金币的重量和价值
        ave[i] = a[i][1] / a[i][0];//计算每箱金币的(重量/价值)
    }
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = n-2; j >=i; j--)
        {
            if (ave[j]<ave[j+1])
            {
                pp = a[j][0];
                a[j][0] = a[j+1][0];
                a[j+1][0] = pp;
                qq = a[j][1];
                a[j][1] = a[j+1][1];
                a[j+1][1] = qq;
                ss = ave[j];
                ave[j] = ave[j + 1];
                ave[j + 1] = ss;
            }
        }
    }
    double sum = 0;
    double value = 0;
    int i = 0;
    for (i = 0; sum < t && i < n; i++)//按照性价比从高到低装金币
    {
        sum += a[i][0];
        value += a[i][1];
    }
    if (i != n)
    {
        sum -= a[i - 1][0];//减去多加的
        value -= a[i - 1][1];
        value += (t - sum) * a[i - 1][1] / a[i - 1][0];//补齐剩余部分
        printf("%.2f", value);
    }
    else
    {
        sum = 0;
        for (i = 0; i < n; i++)
        {
            sum += a[i][1];
        }
        printf("%.2f", sum);
    }
    return 0;
}

​

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AAAAAZBX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值