hdu 2844 Coins(多重背包)

本文介绍了解决多重背包问题的一种方法,通过使用不同类型的背包填充算法(如零一背包、完全背包及多重背包算法),实现硬币组合以达到指定的目标值。文章通过具体的代码示例详细解释了每种算法的应用场景及其在实际问题中的实现。

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

          多重背包,是一个将背包装满的问题,所以在设初始值时,要将其设为无穷小即可,这里我是用我自己的想法,初始值仍然是0,这里可以理解装满的问题,我设初始值为0那么加了那些值之后,只要是能用那些硬币表示出来的数就一定会出现在f[]数组值里,而m表示这些硬币要凑出的数,所以f[m]如果等于m的话那么它就能凑出m这个数,否则就必不会等于,因为这里我们是将它的体积和价值视为一样的,即都是硬币的面值。这里理解清楚了,就差不多了。只要在设判断是是f[m] == m?就可以不用管初始值时0还是负无穷,随便设一个都可以。

下面贴上代码:218 MS

#include <stdio.h>
#include <string.h>


int f[100005];
int a[100005];
int num[1005];


void ZeroOnePack(int cost,int weight,int V){
    int v;
    for(v = V; v >= cost; --v){
        if(f[v] < f[v - cost] + weight)
        f[v] =f[v - cost] + weight;
    }
}

void CompletePack(int cost,int weight,int V){
    int v;
    for(v = cost; v <= V; v++){
        if(f[v] < f[v - cost] + weight)
        f[v] =f[v - cost] + weight;
    }
}

void MultiplePack(int cost,int weight,int amount,int V){
    if(cost * amount >= V){
        CompletePack(cost,weight,V);return ;
    }
    int k = 1;
    while(k < amount){
        ZeroOnePack(k * cost,k * weight,V);
        amount -= k;
        k *=2;
    }
    ZeroOnePack(amount * cost,amount * weight,V);
}
int main()
{
    int n,m,k,i,re;
    while(scanf("%d%d",&n,&m)){
        if(!n&&!m)break;
        memset(f,0,sizeof(f));
        for(i = 1; i <= n; i++){
            scanf("%d",&a[i]);
        }
        for(i = 1; i <= n; i++){
            scanf("%d",&num[i]);
            if(num[i] > 1)
            MultiplePack(a[i],a[i],num[i],m);
            else ZeroOnePack(a[i],a[i],m);
        }

        k = 0;
        for(i = 1; i <= m; i++){
            if(f[i] == i) {
                k++;
            }
        }
        printf("%d\n",k);

    }
    return 0;
}


内容概要:本文详细介绍了水中有限长加肋圆柱壳体振动和声辐射的近似解析解,并提供了完整的Python实现。文中首先阐述了问题背景,即加肋圆柱壳体作为水下航行器的主要结构形式,肋骨的作用被简化为只有法向力。接着,通过一系列关键方程(如模态振动速度方程、壳体机械阻抗、特征矩阵元素等),推导出加肋圆柱壳体的振动和声辐射特性。Python代码部分实现了这些理论,包括定义`CylindricalShell`类来封装所有计算功能,如初始化参数、机械阻抗、辐射阻抗、肋骨阻抗、模态速度、辐射功率和辐射效率的计算。此外,还扩展了带刚性圆柱障板的圆柱壳体类`CylindricalShellWithBaffle`,并引入了集中力激励、简支边界条件和低频段计算的内容。最后,通过具体示例展示了如何创建壳体对象、设置参数、计算频率响应以及绘制结果图表,验证了加肋对辐射声功率和声辐射效率的影响。 适合人群:具备一定编程基础和声学基础知识的研究人员、工程师,特别是从事水下声学、船舶工程和振动分析领域的专业人员。 使用场景及目标:①通过代码实现和理论推导,深入理解加肋圆柱壳体的振动和声辐射特性;②分析肋骨对壳体声学性能的影响,优化结构设计;③利用Python代码进行数值模拟,评估不同参数配置下的声辐射效率和功率;④为实际工程项目提供理论支持和技术参考。 其他说明:本文不仅提供了详细的数学推导和Python代码实现,还讨论了实际应用中的注意事项,如参数调整、高频模态考虑、肋骨模型细化和数值稳定性处理。建议读者结合实际需求,灵活运用文中提供的理论和代码,进行更深入的研究和实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值