PTA | 程序设计类实验辅助教学平台 (pintia.cn)
我刚开始是这样写的:
#include<iostream>
#include<vector>
using namespace std;
int sum = 0;
void dfs(vector<int> a, int index, int n) {
if (index == n) {
return;
}
for (int i = index; i < n; ++i) {
sum += a[i];
dfs(a, i + 1, n);
sum -= a[i];
}
}
int main() {
int n = 0;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
dfs(a, 0, n);
cout << sum << endl;
return 0;
}
Debug
#include<iostream>
#include<vector>
using namespace std;
int sum = 0;
void dfs(vector<int> a, int index, int n) {
if (index == n) {
return;
}
for (int i = index + 1; i < n; ++i) {
sum += a[index] * 10 + a[i] + a[i] * 10 + a[index];
}
dfs(a, index + 1, n);
}
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
dfs(a, 0, n);
cout << sum << endl;
return 0;
}
假设数组a中有两个数字a[index]和a[i],那么a[index]*10 + a[i]就是将这两个数字组合成一个十位数和个位数的操作。同理,a[i]*10 + a[index]也是将这两个数字组合成一个十位数和个位数的操作。所以,sum += a[index]*10 + a[i] + a[i]*10 + a[index]就是将这两种组合的和累加到sum中。
这样的操作会计算出所有可能组合的两位数的和
二刷
#include<iostream>
using namespace std;
int main()
{
int n=0;cin>>n;
int num[10]={0};
int sum=0;
for(int i=0;i<n;i++)
{
cin>>num[i];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i!=j)
{
sum+=num[i]*10+num[j];
}
}
}
cout<<sum;
return 0;
}