城市路站
题目名称应该就叫做这个,反正老师只给了题面
题面
在a,b两个城市之间设有n个路站(如下图中的s1,且n<100),城市与路站之间、路站和路站之间各有若干条路段(各路段数<20,且每条路段上的距离均为一个整数)。
a,b的一条通路是指: 从a出发,可经过任一路段到达s1,再从s1出发经过任一路段,…最后到达b。通路上路段距离之和称为通路距离(最大距离<1000)。当所有的路段距离给出之后,求出所有不同距离的通路个数(相同距离仅记一次)。例如:下图所示是当n=1时的情况:
从a到b的通路条数为6,但因其中通路5+5=4+6,所以满足条件的不同距离的通路条数为5。数据结构:n: 记录a,b间路站的个数:数组di,01记录第i-1到第路站间路段的个数;dli,
1],dli,2],…记录每个路段距离;数组g记录可取到的距离
思路解释
只需要先算出到达上一个车站有多少个解,根据这些再和新产生的路进行计算,就能较为轻松的统计出新的方法,这里选择用map进行去重。(当然想用数组或者set都可以,看个人习惯)
直接上代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int n ,ans , k ,b;
map<int,int> mp , mp1;
int a[maxn];
int main(){
cin >> n ;
int _ = n + 1;
mp[0] = 1;
while(_--){
cin >> k ;
for(int i = 0 ; i < k ; i++){
cin >> b ;
for(auto it = mp.begin() ; it != mp.end() ; it++)
mp1[it->first + b] = 1;
}
mp = mp1;
mp1.clear();
}
cout << mp.size() << endl;
}