AtCoder Beginner Contest 165 C.Many Requirements
題目鏈接
很多人看到題目就懵了,我個人感覺這題位置不好,比D要難一點😀,我說的難是指難想一點~
一開始大家肯定比較懵,看來半天讀懂了題目意思,但是卻想不到最優解法,我們不妨觀察一下 的範圍,立馬想到了暴力,沒錯,我們就暴力列舉所有 A 可能的排列情況即可,用到了 。
下面我細說一下這個 ,很多人可能不確定到底要不要 ,首先我們要想,爲什麼要 ? 其實就是爲了列舉所有情況,而用與不用其實就是你有沒有用 的差別,下面我掛兩段代碼供大家參考,一個是用了,一個沒有用:
//用了return的代碼
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,q,a[50],b[50],c[50],d[50],ans;
int p[10];
void dfs(int len,int pre){
if(len==n){
int sum=0;
for(int i=0;i<q;i++) if(p[b[i]-1]-p[a[i]-1]==c[i]) sum+=d[i];
ans=max(ans,sum);
return;
}
for(int i=pre;i<=m;i++){
p[len]=i;
dfs(len+1,i);
}
}
main()
{
cin>>n>>m>>q;
for(int i=0;i<q;i++) cin>>a[i]>>b[i]>>c[i]>>d[i];
dfs(0,1);
cout<<ans;
return 0;
}
//沒用return的代碼
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,q,a[50],b[50],c[50],d[50],ans;
int p[10];
void dfs(int len,int pre){
if(len==n){
int sum=0;
for(int i=0;i<q;i++) if(p[b[i]-1]-p[a[i]-1]==c[i]) sum+=d[i];
ans=max(ans,sum);
return;
}
else{
for(int i=pre;i<=m;i++){
p[len]=i;
dfs(len+1,i);
}
}
}
main()
{
cin>>n>>m>>q;
for(int i=0;i<q;i++) cin>>a[i]>>b[i]>>c[i]>>d[i];
dfs(0,1);
cout<<ans;
return 0;
}