交叉合并二维数组,穷举可能性(不知道怎么起名字。。。)

本文介绍了一种使用PHP实现的二维数组交叉合并方法,通过穷举可能性来生成所有组合。

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

<?php

/**
 * @author Wangzhe 
 */
class Yoyi_Common_Array
{

    /**
     * 交叉合并二维数组,穷举可能性
     * @param type $nArray 任意二维数组
     * @author Nio.King 王哲
     * @return array 
     * @example
     * $arrData = array(
      'a' => array("a1", "a2", 'a3'),
      'b' => array("b1", "b2", 'b3', 'b4'),
      'c' => array("c1", "c2", 'c3','c4','c5'),
      );
      print_r(Yoyi_Common_Array::crossMerger($arrData));
     */
    public static function crossMerger($nArray)
    {
        $array = array();
        $keyArr = array();
        $result = array();
        $master = array();
        foreach ($nArray as $k => $item)
        {
            $keyArr[] = $k;
            $array[] = $item;
        }
        $sum = 0;
        for ($i = 0; $i < count($array); $i++)
        {
            if ($sum)
            {
                $sum *= count($array[$i]);
            } else
            {
                $sum = count($array[$i]);
            }
            $master[] = array(0, count($array[$i]));
        }

        $i = 0;
        //$result[] = $master;
        while (true)
        {
            $ok = $zhuizi = count($array) - 1;

            $master[$zhuizi][0]++;

            while (true)
            {

                if ($master[$zhuizi][0] >= $master[$zhuizi][1])
                {
                    $master[$zhuizi][0] = 0;
                    if (isset($master[$zhuizi - 1][0]))
                    {
                        $master[$zhuizi - 1][0]++;
                    }
                }
                $zhuizi--;
                if ($zhuizi < 0)
                {
                    $result[] = $master;
                    break;
                }
            }
            $i++;
            if ($i >= $sum)
            {
                break;
            }
        }




        $overResult = array();
        $realResult = array();
        for ($i = 0; $i < count($result); $i++)
        {
            foreach ($result[$i] as $key => $value)
            {
                if ($key >= 0)
                {
                    $overResult[$i][] = $value[0];
                }
            }
        }
        foreach ($overResult as $subArray)
        {
            $temp = array();
            foreach ($subArray as $k => $v)
            {
                $temp[$keyArr[$k]] = $array[$k][$v];
            }
            $realResult[] = $temp;
        }
        //while()
        return $realResult;
    }

}

?>


 

多维0-1背包问题是指在给定容量和一组物品的情况下,如何选择物品使得总重量超过容量且总价值最大化。在这个问题中,每个物品有多个属性,我们要选择的是哪个属性的物品,以及每个物品在选择属性下的是否放入背包(0表示放入,1表示放入)。 为了解决这个问题,我们可以使用一个二维数组来表示状态转移方程。假设有n个物品和m个属性,dp[i][j]表示前i个物品在j属性下的最大价值。 具体的穷举算法如下: 1. 初始化一个大小为(n+1)*(m+1)二维数组dp,并将其所有元素初始化为0。 2. 遍历物品i从1到n,属性j从1到m,依次计算dp[i][j]的值。 3. 对于每个物品i和属性j,有两种情况: - 若第i个物品在属性j下的重量大于背包的容量,则dp[i][j] = dp[i-1][j],即选择放入背包; - 若第i个物品在属性j下的重量小于等于背包的容量,则dp[i][j] = max(dp[i-1][j], dp[i-1][j-1] + 第i个物品的价值),即选择放入或放入背包取决于哪种方式能获得更大的总价值。 最终,dp[n][m]即为所求的最大总价值。 下面是一个简单的用Matlab实现的代码示例: ```matlab function max_value = knapsack(n, m, weights, values, capacity) dp = zeros(n+1, m+1); for i = 1:n for j = 1:m if weights(i, j) > capacity dp(i+1, j+1) = dp(i, j+1); else dp(i+1, j+1) = max(dp(i, j+1), dp(i, j) + values(i, j)); end end end max_value = dp(n+1, m+1); end % 测试 n = 3; m = 2; weights = [3, 1; 2, 2; 1, 3]; values = [2, 3; 4, 5; 6, 7]; capacity = 5; max_value = knapsack(n, m, weights, values, capacity); disp(max_value); ``` 以上代码中,n表示物品的数量,m表示属性的数量,weights是一个n*m的矩阵,表示每个物品在同属性下的重量,values是一个n*m的矩阵,表示每个物品在同属性下的价值,capacity表示背包的容量。请根据实际情况修改测试用例中的n、m、weights、values和capacity的值,以便验证代码的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值