多校A题Altruistic Amphibians

这道题一开始看到就没想到01背包,原本觉得尽量让跳跃高度较小的青蛙往外跳,这样就可以使跳出去的青蛙尽量多,其实这种思路逻辑是正确的。但是实现困难,也是对算法不够理解,其实这道题应该想,如何使一个青蛙重量允许下叠的高度尽量高,这样也就实现了尽量跳跃高度小的青蛙能跳出去。所以问题就在于,如何使一个青蛙重量下叠罗汉的高度尽量高,想到这一方面背包就很明显了。首先不管跳高这只在判断时使用。考虑两个数值,容量(青蛙之上的重量小于本身重量)以及价值(自身高度)。由于背包学的不是很好,所以这道题我从01背包逐渐类比过来。

首先01背包就是给定一个容量,每遇到物品就选择。数组下标表示当前背包容量,数组值代表该容量最大价值。那么这道题类比过来,就是一个青蛙重量,在此重量之内最大高度是多少。但是这样最后没办法判断每只青蛙能不能跳出去(你只能得到每只青蛙能放在上面的高度,不能得到放在下面的高度)那么就换种方式考虑。

1.一个重量下,比他大的重量尽量能放多大高度。背包是逐渐扩容,从容量1.2.3。。。到最大容量,这个问题就是逐渐缩小,重量。。。3.2.1。

2.01背包问题用dp做是不需要排序的每一次扩充都会自动遍历所有选择,所以不需要排序出最优选择,但是这里需要是为什么呢?这里排序是其他用途而不是选出最优选择。背包问题每个大容量建立在小容量的基础,而这个问题如果也按照这个顺序,那么每个大重量建立在小重量,会发现与逐渐缩小不一致,很多值没办法赋,所以要先将重量本身派一个徐使其符合(这里有点难理解,我也没有完全理解讲述也会不太清晰)

这是我对这道题仔细思考,最重要的是我背包学的菜啊,不然可能就能看出来这道题就是一个01背包加判断,其实学背包学得好这道题还是很简单的。以下为代码



#include <cstdio>

#include <algorithm>

using namespace std;

const int N = 1e5+5, M = 1e8+10;

 

struct fro {

   
int l, w, h;

}a[N];

int dp[M];

bool cmp(fro a,fro b){

   
return a.w>b.w;

}

int main()

{

   
int n, gao, ans = 0;

   
scanf("%d%d", &n, &gao);

   
for(int i = 0; i < n; i++)

     
  scanf("%d%d%d",
&a[i].l, &a[i].w, &a[i].h);

   
sort(a, a+n,cmp);

   
for(int i = 0; i < n; i++) {

       
int w = a[i].w;

       
if( dp[w]+a[i].l > gao) ans++;  


       
for(int x = 1; x < min(w,M-w); x++) {

           
dp[x] = max(dp[x], dp[x+w]+a[i].h);   
//体重1-x能叠的最大高度

       
}

    }

   
printf("%d\n", ans);

   
return 0;

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值