欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NSUOJ - 暴力 - Problem 3155

程序员文章站 2022-07-12 15:53:01
...

题目来源 http://acm.ccniit.com/problem.php?cid=1201&pid=3

一.题目描述

给你三个整数N,M,Q,和Q个要求ai,bi,ci,di。
构造一个N项的数列A,序列A里面的值都为正整数,满足 Ai ≤ Ai+1 ,最大项AN不超过M,若满足式子Abi - Aai = ci ,则可获得di 点分,求满足条件的序列的最大得分。

Input

第一行输入N,M,Q,下面Q行,每行4个数。
ai   bi    ci   di
……
aQ  bQ  cQ  dQ
2 ≤ N ≤ 10
1 ≤ M ≤ 10
1 ≤ Q ≤ 50
1 ≤ ai < bi ≤ N  ( i = 1,2,...,Q )
0 ≤ ci ≤ M - 1  ( i = 1,2,...,Q )
1 ≤ di ≤ 105  ( i = 1,2,...,Q )
(ai,bi,ci ) ≠ ( aj,bj,cj )  ( i ≠ j)

Output

最大得分

Sample Input Copy

3 4 3
1 3 3 100
1 2 2 10
2 3 2 10

Sample Output Copy

110

HINT

这个序列可以为:1 2 4 或 1 3 4

二.解题思路

 结构体存获得分数要求  暴力搜索 dfs模拟数列  再跑循环判断当前数列获得的总分数 max取最大值

三.代码

#include <bits/stdc++.h>
using namespace std;
struct p {
    int l, r, d, money;
} z[100];
int v[20];
int n, m, num, q;
long long mmax = 0;
void dfs(int x, int step) {
    if (step > n) { //模拟数列完成
        long long d = 0;
        for (int i = 1; i <= q; ++i) {
            if (v[z[i].l] + z[i].d == v[z[i].r]) { //满足获得该项分数
                d += z[i].money;
            }
        }
        mmax = max(mmax, d);
        return;
    }
    for (int i = x; i <= m; ++i) {
        v[step] = i;
        dfs(i, step + 1);//模拟数列
    }
}

int main() {
    scanf("%d%d%d", &n, &m, &q);
    for (int i = 1; i <= q; ++i) {
        scanf("%d%d%d%d", &z[i].l, &z[i].r, &z[i].d, &z[i].money);
    }
        dfs(1, 1);
        cout<<mmax<<endl;
}

相关标签: dfs dfs