牛牛的超市

牛课题霸:牛牛的超市

牛牛最近在家闲的无聊,所以决定在家开一个小超市,为了方便卖东西,牛牛发明了一种用来兑换东西的新型货币,牛牛给这种新型货币起了个名字叫牛币,现在牛牛有n(n<=50)种不同的币值,其中币值为 value(value<=50) 的有 w(w<=20) 个,现在牛妹来到牛牛的超市买东西,牛妹有 x(x<=100) 元牛币,但是牛妹想将 x 元牛币换成若干零钱,请问有多少种换钱的方案?

输入
3,6,[ [1, 100],[2, 100], [5, 100] ]

说明:
表示有3种货币,要兑换的金额是6元,
第一种货币面额1,有100张
第二种货币面额2,有100张
第二种货币面额5,有100张

输出
5

使用动态规划算法求解

n\x0元1元2元3元4元5元6元
0元/币1000000
1元/币1111111
2元/币1122334
5元/币1122345

如上表所示,定义dp[n][x]表示有n种货币,x元钱时, 总共的兑换方案。
dp[0][0] = 1

class Solution {
public:
    /**
     * 
     * @param n int整型 :牛币值种类数
     * @param x int整型 :牛妹拥有的钱数
     * @param a int整型vector<vector<>> :第二个vector中的第一列表示币值,第二列表示牛牛拥有币值的个数
     * @return int整型
     */
    int solve(int n, int x, vector<vector<int> >& a) {
        // write code here
        int dp[n+1][x+1];
        memset(dp, 0, sizeof(dp));
        dp[0][0] = 1;

        for(int i = 1; i <= n; i++)
            for(int j = 0; j <= x; j++)
            /*
            * 当第i种货币取k个时,剩下的钱换其他货币有dp[i-1][j - k*a[i-1][0]]种方案
            */
                for(int k = 0; k <= a[i-1][1]; k++)
                    if(j - k*a[i-1][0] >= 0) {
                        dp[i][j] += dp[i-1][j - k*a[i-1][0]];
                    } else {
                        break;
                    }
        return dp[n][x];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的牛奶配送问题的 MATLAB 代码: ```matlab % 牛奶配送问题 % 定义需求矩阵 demand = [100 150 200 100]; % 定义成本矩阵 cost = [0.2 0.3 0.4 0.5; 0.25 0.35 0.45 0.55; 0.3 0.4 0.5 0.6; 0.35 0.45 0.55 0.65]; % 定义变量 x(i,j) 表示第 i 个工厂向第 j 个超市配送的数量 x = optimvar('x',4,4,'LowerBound',0); % 定义目标函数(最小化成本) obj = sum(sum(cost.*x)); % 定义约束条件 constr = [sum(x,1) == demand; % 每个超市的需求必须满足 sum(x,2) <= 500]; % 每个工厂的产能不能超过 500 % 定义优化问题 problem = optimproblem('Objective',obj,'Constraints',constr); % 求解优化问题 [sol,fval] = solve(problem); % 输出结果 disp('每个工厂向每个超市的配送数量为:'); disp(sol.x); disp(['总成本为:' num2str(fval)]); ``` 在上面的代码中,我们首先定义了需求矩阵和成本矩阵,然后定义了变量 x(i,j) 表示第 i 个工厂向第 j 个超市配送的数量。接着,我们定义了目标函数和约束条件,最后求解优化问题,并输出结果。 需要注意的是,上面的代码只是一个简单的示例,实际的牛奶配送问题可能会更加复杂,需要根据具体情况进行调整。 ### 回答2: 牛奶配送问题是一个优化问题,要求在给定的配送点和配送数量的情况下,确定最佳的配送路线,使得配送成本最小。 以下是一个简单的MATLAB代码来解决该问题: ```matlab % 初始化配送点坐标和需求量 points = [1, 2; 3, 4; 5, 6; 7, 8]; demands = [10; 20; 15; 18]; % 初始化配送车数量和容量 num_vehicles = 2; vehicle_capacity = 30; % 计算配送距离矩阵 num_points = size(points, 1); dist_matrix = zeros(num_points, num_points); for i = 1:num_points for j = 1:num_points dist_matrix(i, j) = norm(points(i, :) - points(j, :)); end end % 定义优化问题 problem.options = optimoptions('intlinprog', 'Display', 'off'); problem.integerconstraints = 1:num_points; problem.lb = zeros(num_points, 1); problem.ub = ones(num_points, 1); problem.Aeq = ones(1, num_points); problem.beq = num_vehicles; problem.A = [repmat(-eye(num_points), num_vehicles, 1), kron(ones(1, num_vehicles), eye(num_points))]; problem.b = [-repmat(demands, num_vehicles, 1); vehicle_capacity * ones(num_points, 1)]; % 求解优化问题 solution = intlinprog(dist_matrix(:), problem); % 提取解决方案 routes = find(solution > 0.5); num_routes = numel(routes); disp('最佳配送路线:') for i = 1:num_routes disp(['路线', num2str(i), ':']) route_points = points(routes == i, :); disp(route_points) end ``` 以上代码首先初始化配送点和需求量。然后计算配送距离矩阵。接下来定义优化问题,其中约束条件包括每个配送点的分配数量、每辆配送车容量限制等。最后使用整数线性规划函数`intlinprog`求解优化问题,并提取解决方案,得到最佳配送路线。 ### 回答3: 牛奶配送问题可以使用MATLAB代码进行求解。首先,我们需要定义相关的数据和变量。假设有5个配送点和3个物流中心,每个配送点需要一定数量的牛奶。我们可以用一个5x3的矩阵来表示每个配送点和物流中心之间的运输成本,另外还有一个5x1的向量表示每个配送点的需求量。假设我们已经获得了这些数据。 首先,我们需要定义变量x(i,j)表示从物流中心j到配送点i的运输量。这些变量的取值范围为非负整数,可以通过将它们定义为整数变量来实现。 假设我们需要最小化总运输成本,我们可以定义目标函数为: minimize cost = sum(sum(cost(i,j) * x(i,j))) 其中,cost(i,j)表示从物流中心j到配送点i的运输成本。 接下来,我们需要添加一些约束条件。首先,我们需要保证每个配送点的需求量被满足。那么我们可以添加以下约束: sum(x(i,j)) >= demand(i) 其中,demand(i)表示配送点i的需求量。 另外,我们还需要保证每个物流中心的供应量足够,不超过其最大容量。假设我们已经获得了每个物流中心的最大容量,我们可以添加以下约束: sum(x(i,j)) <= capacity(j) 其中,capacity(j)表示物流中心j的最大容量。 最后,我们还需要添加一些非负性约束条件,保证变量取值范围为非负整数: x(i,j) >= 0 将所有的约束条件添加到优化问题中,使用MATLAB的优化工具箱中的线性规划函数进行求解即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值