SCAU 19185 01背包问题

19185 01背包问题

时间限制:1000MS  代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题   语言: 不限定

Description

一个旅行者有一个最多能装 M公斤的背包,现在有 n件物品,它们的重量分别是W1,W2,...,。
它们的价值分别为C1,C2,...,,求旅行者在不超过背包重量M的情况下,能获得最大总价值。

PS:01背包问题也能用于个人的时间管理,如何分配时间在不同的任务上,才能最大化提升个人价值。

输入格式

第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);

第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。

输出格式

一个数,表示最大总价值。

输入样例

10 4
2 1
3 3
4 5
7 9

输出样例

12

提示

通过的同学可以查看标程,提供了二维数组和一位数组两种写法。

作者

 30002692

解题思路

采用二维数组dp[i][j]表示前i个物品中重量不超过j的最大价值,dp[n][m]就是我们需要求解的结果。

代码如下

#include <iostream>
#include <cmath>

using namespace std;

int w[201]; // 重量
int v[201]; // 价值
int dp[32][201]; // dp[i][j]示从前i个物品中选,选出的总体积小于j的最优解

int main()
{
    int m, n; //背包容量,物品数量
    cin >> m >> n;
    int i, j;
    for(i=1;i<=n;i++)
        cin >> w[i] >> v[i];

    for(i=0;i<=m;i++)
        dp[0][i] = 0;

    // 前i个物品
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            if (w[i] > j)
                dp[i][j] = dp[i-1][j]; // 大于当前背包容量
            else
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]); // 是否选第i个物品
        }
    }
    cout << dp[n][m] << endl;
    return 0;
}

### SCAU 迷宫问题的算法实现 对于SCAU 18714迷宫问题,解决方法依赖于递归回溯的思想来探索所有可能路径直到找到最短路径或者确认无解的情况[^1]。然而,在更复杂的版本如SCAU 18276走迷宫(传送门),除了基本的上下左右移动外还需要处理传送门机制,并且要特别注意优化以防止不必要的重复计算从而提高效率[^2]。 为了有效地求解此类问题,广度优先搜索(BFS)是一种常用的方法。BFS能够逐层扩展节点并记录访问状态,确保最先到达目标位置的是最短路径。当遇到传送门时,可以直接跳转到对应出口继续搜索过程。为了避免陷入无限循环或增加时间复杂度,应当标记已经访问过的区域,即使这些地方后来变成了可通行的状态也不再次考虑它们作为新的起始点[^3]。 下面给出一段基于Python语言描述的简化版代码框架用于演示如何利用队列结构配合集合数据类型追踪已探查地点: ```python from collections import deque def bfs_maze(maze, start, end, portals): n, m = len(maze), len(maze[0]) queue = deque([start]) visited = set() steps = {start: 0} while queue: (cx, cy) = queue.popleft() if (cx, cy) == end: return steps[(cx, cy)] for dx, dy in ((0,-1),(0,1),(-1,0),(1,0)): nx, ny = cx + dx, cy + dy if not (0 <= nx < n and 0 <= ny < m): continue if maze[nx][ny] != '0': continue if (nx, ny) in visited: continue next_pos = (portals.get((nx, ny)) or (nx, ny)) if next_pos not in visited: visited.add(next_pos) queue.append(next_pos) steps[next_pos] = steps[(cx, cy)] + 1 return "die" ``` 此函数接受参数`maze`(二维列表表示的地图)`start`,`end`(元组形式的目标坐标),以及字典类型的`portals`用来映射各个传送门之间的关系。遍历过程中一旦发现当前坐标的下一个位置存在有效传送口,则立即转移到指定目的地而不消耗额外步数;反之则按照常规方式前进一格。最终返回从起点至终点所需的最小步数,若无法抵达则输出字符串"die"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值