问题 A: 0-1背包问题(基于暴力)
题目描述
给定一个容积为m的背包,去尝试装n个重量为wi、价值为vi的物体,求能装下的物体的最大价值。
输入
输入的第一行有两个整数n和m,分别表示物品的个数,背包的最大容量。
接下来n行,每行两个数字,每个物品的重量w和价值v
数据保证1<=n<=20,1<=w , v<=2000
输出
一个整数,表示可获得的最大价值。
样例输入
3 30
16 45
15 25
15 25
样例输出
50
思路:典型的01背包问题,每一个物品只有取和不取,枚举价值判断是否需要取
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e3+10;
int v[maxn],w[maxn];
int dp[maxn*100];
int main()
{
int n,back;
scanf("%d%d",&n,&back);
for(int i = 0;i < n;i++)
scanf("%d%d",w+i,v+i);
dp[0] = 0;
for(int i = 0;i < n;i++)
{
for(int j = back;j >= w[i];j--)
{
dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
}
}
printf("%d\n",dp[back]);
return 0;
}
问题 B: 八皇后问题(基于暴力)
题目描述
皇后问题。所谓的n皇后问题,是指在n×n的棋盘上放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
为了使问题更加有趣,我们需要求在n×n的棋盘上,放置k个皇后,共有多少种可能的方案数?
输入
两个正整数n和k,(n,k<=10)
输出
一个整数,表示方案数。
样例输入
8 8
样例输出
92
思路:这是一个n*n棋盘的k皇后问题,相比于n皇后问题我们可以不放皇后,所以dfs的过程中从0开始放表示不放。
#include<bits/stdc++.h>
using namespace std;
int cow[15];
int ans = 0;
int curzero;
int flag;
int n,k;
bool isgood(int x)
{
if(cow[x] == 0 && curzero == n-k)
return false;
if(cow[x] == 0)
return true;
for(int i = 1;i < x;i++)
{
if(cow[i] != 0)
{
if(abs(i-x) == abs(cow[i]-cow[x]) || cow[i] == cow[x])
return false;
}
}
return true;
}
void dfs(int t)
{
if(flag == k)
{
ans++;
return ;
}
if(t > n)
return;
for(int i = 0;i <= n;i++)
{
cow[t] = i;
if(isgood(t))
{
//cout<<i<<" "<<flag<<" "<<t<<endl;
if(i == 0)
curzero++;
else
flag++;
dfs(t+1);
if(i =&