#include<iostream>
#include <vector>
using namespace std;
vector<int> get(int n)
{
vector<int> dp(n+1, 0);
vector<int> dp1(n+1, 0);
dp[1] = 1;
dp[2] = 2;
dp1[1] = 1;
dp1[2] = 1;
for (int i = 3; i <= n; i++)
{
dp[i] = dp[i-1] + dp[i-2];
dp1[i] = dp[i] - dp1[i-1] - dp1[i-2];
}
return {dp[n], dp1[n]};
}
int main()
{
int n;
while (cin >> n)
{
vector<int> res = get(n);
cout << res[0] << "," << res[1] << endl;
}
return 0;
}
2.数组分为两半,要求两部分的差值最小
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int diff(vector<int>& vec)
{
int len = vec.size();
int sum = 0;
for (int i = 0; i < len; ++i) {
sum += vec[i];
}
vector<vector<int> > dp;
for (int i = 0; i <= len; i++) {
vector<int>tmp;
for (int j = 0; j <= sum / 2; ++j) {
tmp.push_back(0);
}
dp.push_back(tmp);
}
for (int i = 1; i <= len; ++i) {
for (int j = 1; j <= sum / 2; ++j) {
if(j>=vec[i-1])dp[i][j] = max(dp[i-1][j],dp[i-1][j-vec[i-1]]+vec[i-1]);
else dp[i][j] = dp[i - 1][j];
}
}
return max(sum-dp[len][sum / 2], dp[len][sum/2]);
}
int main()
{
int m;
while (cin >> m)
{
vector<int> arr(m, 0);
for (int i = 0; i < m; i++) cin >> arr[i];
cout << diff(arr) << endl;
}
return 0;
}