165.小猫爬山

这类分组问题无非就是两种搜索顺序:

1.对于每个元素,枚举它可能分配到哪一个组

2.对于每个组,枚举它可能容纳哪些元素

这道题先把猫的体重从大到小排序,可以减小状态空间:

复制代码
#include <iostream>
#include <algorithm>
#include <stdlib.h>
using namespace std;

const int N = 20, INF = 1e9;
int n, m, ans = INF;
int a[N], w[N];

void dfs(int Now, int Cars)
{
    if(Cars >= ans) return;
    if(Now == n + 1)
    {
        ans = Cars;
        return ;
    }
    for(int i = 1; i <= Cars; i++)
     if(w[i] + a[Now] <= m) 
      {
        w[i] += a[Now];
        dfs(Now + 1, Cars);
        w[i] -= a[Now];
      }
    w[Cars + 1] = a[Now];
    dfs(Now + 1, Cars + 1);
    w[Cars + 1] = 0;
}

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
     cin >> a[i];
    sort(a + 1, a + n + 1);
    reverse(a + 1, a + n + 1);
    dfs(1,0);
    cout << ans << endl;
    return 0;
}
复制代码

这里用的是方式1,他会不会存在像2一样的问题呢?即虽然避免了组内冗余,但是无法消除组间冗余:

例如,{1,2,3,4}最后的理想分组是{1,3}和{2,4}    

但是在枚举到{1,3}{2,4}之后,又枚举到了{2,4}{1,3}

幸运的是,枚举方式1不会出现组间冗余

因为我们在枚举1号猫的时候,还不存在任何一组,我们只能把他放到第一组来,它不可能会被放到第二组

又因为我们是按照猫的编号从小到大枚举的,所以第一个被处理的只可能是1号猫

因此它只可能出现在组1,不可能出现在组2

对于规模更大的情况,同理

本文作者:Gold_stein

本文链接:https://www.cnblogs.com/smartljy/p/17816984.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Gold_stein  阅读(7)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑
  1. 1 逃离地面 RAD & 三浦透子
逃离地面 - RAD & 三浦透子
00:00 / 00:00
An audio error has occurred.

作词 : 野田洋次郎

作曲 : 野田洋次郎

空飛ぶ羽根と引き換えに 繋ぎ合う手を選んだ僕ら

それでも空に魅せられて 夢を重ねるのは罪か

夏は秋の背中を見て その顔を思い浮かべる

憧れなのか、恋なのか 叶わぬと知っていながら

重力が眠りにつく 1000年に一度の今日

太陽の死角に立ち 僕らこの星を出よう

彼が眼を覚ました時 連れ戻せない場所へ

「せーの」で大地を蹴って ここではない星へ

行こう

もう少しで運命の向こう もう少しで文明の向こう

もう少しで運命の向こう もう少しで

夢に僕らで帆を張って 来たるべき日のために夜を超え

いざ期待だけ満タンで あとはどうにかなるさと 肩を組んだ

怖くないわけない でも止まんない

ピンチの先回りしたって 僕らじゃしょうがない

僕らの恋が言う 声が言う

「行け」と言う