hdu 1712 分组背包

ACboy needs your help

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5403    Accepted Submission(s): 2937

问题描述
ACboy N这学期的课程,他打算花米天学习。 当然,他将获得的利润来自不同课程根据天他花在它。 如何安排N M天课程来最大化利润?

输入
输入包含多个数据集。 一个数据集从一行包含两个正整数N和M,N是课程的数量,M是天ACboy。
接下来跟随一个矩阵[我][j],(1 < =我< = N < = 100,< = 1 j < = < = 100)。 [我][j]表明如果ACboy花天i当然他将获得利润的价值[我][j]。
N = 0和M = 0结束输入。

输出
对于每个数据集,你的程序应该输出一行,包含ACboy将获得最大利润的数量。
样例输入
  
  
2 2 1 2 1 3 2 2 2 1 2 1 2 3 3 2 1 3 2 1 0 0
样例输出
  
  
3 4 6

题目大意:有n门课程,和m天时间,完成a[i][j]得到的价值为第i行j列的数字,求最大价值......

背包九讲之分组背包  

这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有:

f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于组k}

使用一维数组的伪代码如下:

for 所有的组k
    for v=V..0
        for 所有的i属于组k
            f[v]=max{f[v],f[v-c[i]]+w[i]}

注意这里的三层循环的顺序,甚至在本文的第一个beta版中我自己都写错了。“for v=V..0”这一层循环必须在“for 所有的i属于组k”之外。这样才能保证每一组内的物品最多只有一个会被添加到背包中。

解题思路:先每一组组内物品求得最优,然后再组与组之间找最优;但求组内最优时需要注意,分组背包与其它的背包不同,这个需要把for j=v=V......0 放在for k=m所有的k属于m这一组的组内物品,可见上面伪代码。


具体代码:
#include <stdio.h>
#include <string.h>
#define max(a,b) a>b?a:b
int a[105],dp[105]; 
int main()
{
	int n,m;
	while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0)
	{
		int i,j,k;
		memset(dp,0,sizeof(dp));
		for(i=0;i<n;i++)
		{
			for(j=1;j<=m;j++)
				scanf("%d",&a[j]);
			for(j=m;j>=0;j--)
				for(k=1;k<=m;k++)
					if(j-k>=0)
						dp[j]=max(dp[j],dp[j-k]+a[k]);
		}
		printf("%d\n",dp[m]);
	}
	return 0;
}



问题 E: 分组背包问题
时间限制: 1 Sec  内存限制: 128 MB
提交: 1  解决: 1
[提交][状态][讨论版]
题目描述

分组背包问题
有N(N<=100)件物品和一个容量为V(V<=1000)的背包。第i件物品的费用是c[i](c[i]<=100),价值是w[i](w[i]<=100)。
这些物品被划分为k(k<=n)组,每组中的物品互相冲突,最多选一件。
求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大.

提示:分组背包对于当前的空间组与组之间的考虑放或不放,组内成员考虑假如放的话,选一个放。

假如组数只有一组。选择放一个到背包中
for v=V..0
   for i=1..N
 f[v]=max{f[v],f[v-c[i]]+w[i]};

和01背包联系起来。可以这样思考01背包:有n组,每组只有一个物品。
01背包伪代码
for i=1..N   
    for v=V..0
        f[v]=max{f[v],f[v-c[i]]+w[i]}
输入

多组数据
第一行 物品件数n 组数k 背包容量v
第二行 k个数据 表示第j组有多少个物品
接下来每组的物品的费用 c[i] w[i]
输出

最大的价值总和
样例输入
1
10 3 10
3 3 4
1 2
2 3
3 4
4 5
5 6
7 8
8 9
1 2
2 3
3 4
样例输出
13


具体代码:
#include <stdio.h>
#include <string.h>
#define max(a,b) a>b?a:b 
int c[105],w[105];
int z[105],dp[105];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n,k,V,i;
		scanf("%d%d%d",&n,&k,&V);
		for(i=0;i<k;i++)
			scanf("%d",&z[i]);
		memset(dp,0,sizeof(dp));
		for(i=0;i<k;i++)//k组 
		{
			for(int j=0;j<z[i];j++)//每组的物品 
				scanf("%d%d",&c[j],&w[j]);
			for(int k=V;k>0;k--)
				for(int t=0;t<z[i];t++)//对组内的每个物品进行dp 
					if(k>=c[t])
						dp[k]=max(dp[k],dp[k-c[t]]+w[t]);
		}
		printf("%d\n",dp[V]);
	}
	return 0;
}


在当今计算机视觉领域,深度学习模型在图像分割任务中发挥着关键作用,其中 UNet 是一种在医学影像分析、遥感图像处理等领域广泛应用的经典架构。然而,面对复杂结构和多尺度特征的图像,UNet 的性能存在局限性。因此,Nested UNet(也称 UNet++)应运而生,它通过改进 UNet 的结构,增强了特征融合能力,提升了复杂图像的分割效果。 UNet 是 Ronneberger 等人在 2015 年提出的一种卷积神经网络,主要用于生物医学图像分割。它采用对称的编码器 - 解码器结构,编码器负责提取图像特征,解码器则将特征映射回原始空间,生成像素级预测结果。其跳跃连接设计能够有效传递低层次的细节信息,从而提高分割精度。 尽管 UNet 在许多场景中表现出色,但在处理复杂结构和多尺度特征的图像时,性能会有所下降。Nested UNet 通过引入更深层次的特征融合来解决这一问题。它在不同尺度上建立了密集的连接路径,增强了特征的传递与融合。这种“嵌套”结构不仅保持了较高分辨率,还增加了特征学习的深度,使模型能够更好地捕获不同层次的特征,从而显著提升了复杂结构的分割效果。 模型结构:在 PyTorch 中,可以使用 nn.Module 构建 Nested UNet 的网络结构。编码器部分包含多个卷积层和池化层,并通过跳跃连接传递信息;解码器部分则包含上采样层和卷积层,并与编码器的跳跃连接融合。每个阶段的连接路径需要精心设计,以确保不同尺度信息的有效融合。 编码器 - 解码器连接:Nested UNet 的核心在于多层次的连接。通过在解码器中引入“skip connection blocks”,将编码器的输出与解码器的输入相结合,形成一个密集的连接网络,从而实现特征的深度融合。 训练与优化:训练 Nested UNet 时,需要选择合适的损失函数和优化器。对于图像分割任务,常用的损失
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值