头像

bobo0612




离线:10小时前


最近来访(33)
用户头像
yufajichu13
用户头像
lxychloe
用户头像
ukepro
用户头像
中野梓
用户头像
hoool
用户头像
yumesann
用户头像
神秘的洋葱
用户头像
守拙.
用户头像
MichaelScofield
用户头像
sanguosha
用户头像
Tom_Miller
用户头像
os888888
用户头像
段磊
用户头像
TianOvO
用户头像
GZJ_9
用户头像
acwing_37250
用户头像
桂物骑士
用户头像
江流石不转
用户头像
happyfeng
用户头像
故人倾


状态定义: f[i][j]表示前 i 个物品在总体积 == j下的所有方案数
集合划分: 可以根据选 i 这个物品或者不选 i 这个物品进行划分
状态计算: f[i][j] = f[i - 1][j] + f[i - 1][j - w[i]]

不优化空间

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 50;

int n;
int v[N];
int f[N][N];

int main()
{
    cin >> n;

    for (int i = 1; i <= n; i ++) cin >> v[i];

    f[0][0] = 1; // 选0个物品且体积恰好为0的方案数为1

    for (int i = 1; i <= n; i ++)
    {
        for(int j = 0; j <= 40; j ++)
        {
            f[i][j] = f[i - 1][j];
            if(j >= v[i]) 
                f[i][j] += f[i - 1][j - v[i]];
        }
    }

    cout << f[n][40] << endl;

    return 0;
}

优化空间

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;



const int N = 50;

int n;
int v[N];
int f[N];

int main()
{
    cin >> n;

    for (int i = 1; i <= n; i ++) cin >> v[i];

    f[0] = 1; // 选0个物品且体积恰好为0的方案数为1

    for (int i = 1; i <= n; i ++)
        for(int j = 40; j >= v[i]; j --)
            f[j] += f[j - v[i]];

    cout << f[40] << endl;

    return 0;
}


活动打卡代码 AcWing 3445. 点菜问题

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;

int n, m;  // 菜的总数 报销的额度
int dp[N]; // 评分

int main()
{
    cin >> m >> n;

    for (int i = 1; i <= n; i ++ )
    {
        int v , w;
        cin >> v >> w;

        for (int j = m; j >= v ; j --)
            dp[j] = max(dp[j], dp[j - v] + w);
    }

    cout << dp[m] << endl;

    return 0;
}


活动打卡代码 AcWing 3445. 点菜问题

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;

int n, m;
int dp[N];

int main()
{
    cin >> m >> n;

    for (int i = 1; i <= n; i ++ )
    {
        int v , w;
        cin >> v >> w;

        for (int j = m; j >= v ; j --)
            dp[j] = max(dp[j], dp[j - v] + w);
    }

    cout << dp[m] << endl;

    return 0;
}



状态定义: f[i][j]表示考虑前 i 个物品,总重量不超过 j 的情况下最大的价值
集合划分: 可以根据选 i 这个物品或者不选 i 这个物品进行划分
状态计算: f[i][j] = max(f[i-1][j-w[i]] + v[i], f[i-1][j])

不优化空间

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;

int n, m; // n是物品的总数, m是背包的总体积
int f[N][N]; // (已放入的物品总数, 已使用的总体积) 保存的是总价值

int main()
{
    cin >> n >> m;

    for (int i = 1; i <= n; i ++)
    {
        int v, w; //当前物体的体积和价值
        cin >> v >> w; 

        // 枚举所有状态(体积)
        for (int j = 0; j <= m; j ++)
        {
            // 不选择物品i
            f[i][j] = f[i - 1][j];
            // 选择物品i(要求当前容量放的下)
            if (j >= v)
                f[i][j] = max(f[i][j], f[i - 1][j - v] + w);
        }
    }

    cout << f[n][m] << endl;

    return 0;
}

优化空间

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;

int n, m;
int f[N];

int main()
{
    cin >> n >> m;

    for (int i = 1; i <= n; i ++ )
    {
        int v, w;
        cin >> v >> w;

        for (int j = m; j >= v; j -- )
            f[j] = max(f[j], f[j - v] + w);
    }

    cout << f[m] << endl;
    return 0;
}



活动打卡代码 AcWing 2. 01背包问题

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;

int n, m; // n是物品的总数, m是背包的总体积
int f[N][N]; // (已放入的物品总数, 已使用的总体积) 保存的是总价值

int main()
{
    cin >> n >> m;

    for (int i = 1; i <= n; i ++)
    {
        int v, w;
        cin >> v >> w; // 体积 价值

        // 枚举所有的状态(体积)
        for (int j = 0; j <= m; j ++)
        {
            // 不选择物品 i
            f[i][j] = f[i - 1][j];
            // 最大价值 = max(不选i,选i)
            if (j >= v)
                f[i][j] = max(f[i][j], f[i - 1][j - v] + w);
        }
    }

    cout << f[n][m] << endl;

    return 0;
}


活动打卡代码 AcWing 3441. 重复者

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

int n; // 模板的尺寸
vector<string> p; // 输入的模板(二维char数组 = 一维数组string)

// 第k层
vector<string> bfs(int k)
{
    if (k == 1) return p;

    // 上一层的边长为 m
    auto s = bfs(k - 1);
    int m = s.size();

    // 这一层的边长为 n * m
    vector<string> res(n * m);

    // 初始化本层
    for (int i = 0; i < n * m; i ++)
        res[i] = string(n * m, ' ');

    for (int i = 0; i < n; i ++)
        for (int j = 0; j < n; j ++)
            if (p[i][j] != ' ')
                // 枚举上一层的元素
                for (int x = 0; x < m; x ++)
                    for (int y = 0; y < m; y ++)
                        // 本层元素的坐标为 (i * m, j * m)
                        res[i * m + x][j * m + y] = s[x][y];

    return res;
}

int main()
{
    while (cin >> n && n)
    {
        p.clear(); // 清空模板
        getchar(); // 读掉第一行的回车

        for (int i = 0; i < n; i ++)
        {
            string line;
            getline(cin, line);
            p.push_back(line);
        }

        int k; // 一共求k层
        cin >> k;

        auto res = bfs(k);
        for (auto& s : res) cout << s << endl;

    }


    return 0;
}



#include <iostream>
#include <cstring>
#include <algorithm>
#include <limits.h>

using namespace std;

typedef long long LL;

int main()
{
    string s;
    cin >> s;

    LL res = 0;
    for (int i = 0; i < s.size(); i ++)
    {
        // 找到字符串中第一个出现的数字
        if(isdigit(s[i]))
        {
            int j = i;
            while (j < s.size() && isdigit(s[j]))
            {
                res = res * 10 + s[j] - '0';
                if (res > INT_MAX)
                {
                    cout << "-1" << endl;
                    return 0;
                }
                j ++;
            }
            cout << res << endl;
            return 0;
        }
    }

    cout << "-1" << endl;
    return 0;
}



结构体排序 记住operator重载运算符

不知道为什么code颜色不会改变

#include <iostream>
#include <cstring>
#include <algorithm>
#include <sstream>

using namespace std;

const int N = 1e4 + 10;

struct record {
    string info; // 原始数据 最后输出的是这个数据

    string name;
    string date;
    string start;
    double run_time;

    bool operator < (const record &t) const 
    {
        // 运行时间不同, 比较运行时间小的
        if(run_time != t.run_time) 
            return run_time < t.run_time;
        // 否则 比较开始时刻小的
        else 
            return date + start < t.date + t.start; // 按字典序比较
    }

} q[N];

int main()
{
    int i = 0;
    string line;

    // 读入所有的数据 注意最后的空行判断
    while(getline(cin, line) && !line.empty())
    {
        stringstream ssin(line);
        q[i].info = line;

        ssin >> q[i].name >> q[i].date >> q[i].start >> q[i].run_time;
        i ++;
    }

    sort(q, q + i);

     for(int j = 0; j < i; j ++) 
        cout << q[j].info << endl; 

    return 0;
}


活动打卡代码 AcWing 3406. 日志排序

#include <iostream>
#include <cstring>
#include <algorithm>
#include <sstream>

using namespace std;

const int N = 1e4 + 10;

struct record {
    string info; // 原始数据

    string name;
    string date;
    string start;
    double run_time;

    bool operator < (const record &t) const 
    {
        // 运行时间不同, 比较运行时间小的
        if(run_time != t.run_time) 
            return run_time < t.run_time;
        // 否则 比较开始时刻小的
        else 
            return date + start < t.date + t.start; // 按字典序比较
    }

} q[N];

int main()
{
    int i = 0;
    string line;

    // 读入所有的数据
    while(getline(cin, line) && !line.empty())
    {
        stringstream ssin(line);
        q[i].info = line;

        ssin >> q[i].name >> q[i].date >> q[i].start >> q[i].run_time;
        i ++;
    }

    sort(q, q + i);

     for(int j = 0; j < i; j ++) 
        cout << q[j].info << endl; 

    return 0;
}


活动打卡代码 AcWing 3439. 首字母大写

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    string s;
    getline(cin, s);

    for (int i = 0; i < s.size(); i ++)
    {
        if (!i || s[i - 1] == ' ')
            cout << (char)toupper(s[i]); // 一定要加上char强制类型转换
        else
            cout << s[i];
    }

    return 0;
}