机试练习
深搜+回溯
背包问题
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <map>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int w[20];
int c[20];
int max1 = -1;
int n,m;
void dfs(int index,int summ,int sumc)
{
if (index == n)
{
if (sumc > max1)
{
max1 = sumc;
return ;
}
}
else
{
dfs(index+1,summ,sumc);
if (summ+w[index] <= m)
dfs(index+1,summ+w[index],sumc+c[index]);
}
}
int main()
{
cin >> n >> m;
int summ=0,sumc=0;
for (int i=0;i<n;i++)
cin >> w[i];
for (int i=0;i<n;i++)
cin >> c[i];
dfs(0,summ,sumc);
cout << max1 <<endl;
return 0 ;
}
N个数中取K个,并且有最大平方和
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <map>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int n,k,x,maxSum = 0,a[20]={0};
vector<int> t,ans;
int countSum()
{
int sum = 0;
for (int i=0;i<t.size();i++)
{
sum += t[i]*t[i];
}
return sum;
}
void dfs(int index,int sumk,int sumx)
{
if (index == n)
{
if (sumk == k && sumx == x)
{
int nowSum = countSum();
if (nowSum > maxSum)
{
maxSum = nowSum;
ans = t;
}
}
}
else
{
if (sumk+1 <= k && sumx+a[index] <= x)
{
t.push_back(a[index]);
dfs(index+1,sumk+1,sumx+a[index]);
t.pop_back();
}
dfs(index+1,sumk,sumx);
}
}
int main()
{
cin >> n >> k >> x;
for (int i=0;i<n;i++)
cin >> a[i];
t.clear();ans.clear();
dfs(0,0,0);
cout << maxSum << endl;
for (int i=0;i<ans.size();i++)
cout << ans[i] <<' ';
return 0 ;
}