ddd

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5;
int c, n, bestv,cw,cv;
int is[maxn];
struct node
{
    double num, w, v, aver;
}p[maxn];
bool cmp(const node a, const node b)
{
    return a.aver>b.aver;
}
double bound(int i)
{
    double lw = c-cw;
    double r = cv;
    while(i <= n && p[i].w <= lw)
    {
        lw -= p[i].w;
        r += p[i].v;
        i++;
    }
    if(i <= n) r += p[i].aver*lw;
    return r;
}
void backtrack(int i)
{
    
    bound(i);
    if(i > n){
        bestv = cv;
        return;
    }
    if(cw + p[i].w <= c)
    {
        cw += p[i].w;
        cv += p[i].v;
        int t = p[i].num;
        is[t] = 1;
        backtrack(i+1);
        cw-=p[i].w;
        cv-=p[i].v;
        is[t]=0;
    }
    if(bound(i+1)>bestv) backtrack(i+1);
}
void print()
{
    for(int i = 1; i <= n; i++)
    {
        if(is[i])printf("%d ",i);
    }
}
int va[maxn];
int main()
{
    bestv = 0, cw = 0, cv = 0;
    scanf("%d%d",&n,&c);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d%d",&p[i].v,&p[i].w);
        p[i].num = i;
        p[i].aver = p[i].v/p[i].w;
    }
    sort(p+1,p+n+1,cmp);
    backtrack(1);
    cout<<"最优价值为 "<<bestv<<endl;
    cout<<"装入";
    print();
    cout<<endl;
}
/*
4 8
3 2
4 3
5 4
6 5
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值