FZU 2214 Knapsack problem 01超大背包

针对一项特殊条件的大容量背包问题,本文介绍了一种创新性的解决思路。通过转换价值与容量的角色,实现对最大价值的高效求解,并提供了一个具体的AC代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem 2214 Knapsack problem

Time Limit: 3000 mSec    Memory Limit : 32768 KB


Problem Description

Given a set of n items, each with a weight w[i] and a value v[i], determine a way to choose the items into a knapsack so that the total weight is less than or equal to a given limit B and the total value is as large as possible. Find the maximum total value. (Note that each item can be only chosen once).


Input


The first line contains the integer T indicating to the number of test cases.

For each test case, the first line contains the integers n and B.

Following n lines provide the information of each item.

The i-th line contains the weight w[i] and the value v[i] of the i-th item respectively.

1 <= number of test cases <= 100

1 <= n <= 500

1 <= B, w[i] <= 1000000000

1 <= v[1]+v[2]+...+v[n] <= 5000

All the inputs are integers.


Output

For each test case, output the maximum value.


Sample Input
1
5 15
12 4
2 2
1 1
4 10

1 2


Sample Output

15

    一道典型的01背包题,而区别在于,这道题容量的最大范围达到了1000000000,所以如果用常规的01背包的做法是不行的,存容量的数组存不了那么大,而且就算存的下,数据太大也会出现TLE的情况。不过,这题提到了1 <= v[1]+v[2]+...+v[n] <= 5000,这个数据还不算大,所以,这道题可以倒过来去想。将价值和容量的数组调换,求出在n价值的情况下所需的最小容量,最后再跑一个循环查找第一个合适的容量,输出此时的价值就可以了。

    需要注意的是因为倒过来计算了,所以查找的不是max而是min,f数组也要初始化为最大值,f[0]=0。

    下面AC代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int f[5005];
int w[5005];
int v[5005];

int min(int a,int b)
{
    return a<b?a:b;
}
int main()
{
    int kase;
    scanf("%d",&kase);
    while(kase--)
    {
        memset(w,0,sizeof(w));
        memset(v,0,sizeof(v));
        int n;
        int b;
        int V=0;
        scanf("%d%d",&n,&b);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&w[i],&v[i]);
            V+=v[i];
        }
        f[0]=0;
        for(int i=1;i<=V;i++)
        {
            f[i]=1000000000;
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=V;j-v[i]>=0;j--)
            {
                f[j]=min(f[j],f[j-v[i]]+w[i]);
            }
        }
        for(int i=V;i>=0;i--)
        {
            if(f[i]<=b)
            {
                cout<<i<<endl;
                break;
            }
        }
    }
    return 0;
}


内容概要:该论文聚焦于6G通信中20-100GHz频段的电磁场(EMF)暴露评估问题,提出了一种基于自适应可重构架构神经网络(RAWA-NN)的预测框架。该框架通过集成权重分析模块和优化模块,能够自动优化网络超参数,显著减少训练时间。模型使用70%的前臂数据进行训练,其余数据用于测试,并用腹部和股四头肌数据验证模型泛化能力。结果显示,该模型在不同参数下的相对差异(RD)在前臂低于2.6%,其他身体部位低于9.5%,可有效预测皮肤表面的温升和吸收功率密度(APD)。此外,论文还提供了详细的代码实现,涵盖数据预处理、权重分析模块、自适应优化模块、RAWA-NN模型构建及训练评估等内容。 适合人群:从事电磁兼容性研究、6G通信技术研发以及对神经网络优化感兴趣的科研人员和工程师。 使用场景及目标:①研究6G通信中高频段电磁暴露对人体的影响;②开发更高效的电磁暴露评估工具;③优化神经网络架构以提高模型训练效率和预测精度。 其他说明:论文不仅提出了理论框架,还提供了完整的代码实现,方便读者复现实验结果。此外,论文还讨论了未来的研究方向,包括扩展到更高频段(如300GHz)的数据处理、引入强化学习优化超参数、以及实现多物理场耦合的智能电磁暴露评估系统。建议读者在实际应用中根据具体需求调整模型架构和参数,并结合真实数据进行验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值