一、问题:
输入:
5 8
3 5 1 2 2
4 5 2 1 3
输出:
10
代码:
#include<iostream> #include<algorithm> #include<vector> #include<cstdio> #include<cstdlib> using namespace std; int w[100],c[100];//重量和价值 int n,v; int maxvalue = 0; int DFS_MAX(int index,int sumW,int sumC); int main(){ while(cin>>n){ cin>>v; for(int i=0;i<n;i++){ cin>>w[i]; } for(int i=0;i<n;i++){ cin>>c[i]; } DFS_MAX(0,0,0); cout<<maxvalue<<endl; } return 0; } int DFS_MAX(int index,int sumW,int sumC){ if(index==n){ return 1; } //不选当前index DFS_MAX(index+1,sumW,sumC); //选当前index if(sumW+w[index]<=v){ if(sumC+c[index]>maxvalue){ maxvalue = sumC+c[index]; } DFS_MAX(index+1,sumW+w[index],sumC+c[index]); } return maxvalue; }
二、问题:
输入:
4 2 6
2 3 3 4
输出:
2 4
代码:
#include<iostream> #include<algorithm> #include<vector> #include<cstdio> #include<cstdlib> using namespace std; vector<int> temp,ans;//temp临时ans最优 int n,k,x; int a[100]; int maxsumsqu = -1; void DFS_MAXSQU(int index,int nowk,int sum,int sumsqu){ if(nowk==k&&sum==x){ if(sumsqu>maxsumsqu){ maxsumsqu = sumsqu; ans = temp; } return; } if(index>n||nowk>k||sum>x){ return; } //不选index数 DFS_MAXSQU(index+1,nowk,sum,sumsqu); //选index数 temp.push_back(a[index]); DFS_MAXSQU(index+1,nowk+1,sum+a[index],sumsqu+a[index]*a[index]); temp.pop_back(); } int main(){ cin>>n>>k>>x; for(int i=0;i<n;i++){ cin>>a[i]; } DFS_MAXSQU(0,0,0,0); vector<int>::iterator it; for(it=ans.begin();it!=ans.end();it++){ cout<<*it<<" "; } cout<<endl; return 0; }
三、问题:素数环
题目描述
如图所示为一个由n个圆圈构成的圆环。将自然数1,2,...,n放入圆圈内,并且要求任意两个相邻的圆圈内的数字之和为素数。请问给你圆圈数,你能给出放置自然数的所有正确方案吗?
注意:圆圈中的数字一定是从1开始的,并且连续不重复。
输入
输入包含多组测试数据。每组输入占一行,为整数n(0<n<20),表示圆圈数。
输出
对于每组输入,输出所有正确的方案,按字典序从小到大排序。每组输出后输出一个空行。具体输出格式见输出样例。
注意:只能按照顺时针方向放置数字。
注意:只能按照顺时针方向放置数字。
样例输入 Copy
6
8
样例输出 Copy
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
代码:
#include<iostream> #include<algorithm> #include<queue> #include<string> #include<cstdio> #include<stack> #include<list> #include<cmath> #include<cstring> #include<cstdlib> using namespace std; int n,a[30],vis[30]; int prime[40]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0}; void dfs(int num){ if(num==n&&prime[a[num-1]+a[0]]){ for(int i=0;i<num-1;i++){ printf("%d ",a[i]); } cout<<a[num-1]<<endl; }else{ for(int i=2;i<=n;i++){ if(vis[i]==0&&prime[i+a[num-1]]){ vis[i] = 1; a[num++] = i; dfs(num); vis[i] = 0; num--; } } } }; int main(){ int nu = 0; while(cin>>n){ memset(vis,0,sizeof(vis)); nu++; printf("Case %d:\n",nu); a[0]=1; dfs(1); printf("\n"); } system("pause"); return 0; }
四、问题:红与黑
题目描述
小明站在一个矩形房间里,这个房间的地面铺满了地砖,每块地砖的颜色或是红色或是黑色。小明一开始站在一块黑色地砖上,并且小明从一块地砖可以向上下左右四个方向移动到其他的地砖上,但是他不能移动到红色地砖上,只能移动到黑色地砖上。
请你编程计算小明可以走到的黑色地砖最多有多少块。
请你编程计算小明可以走到的黑色地砖最多有多少块。
输入
输入包含多组测试数据。
每组输入首先是两个正整数W和H,分别表示地砖的列行数。(1<=W,H<=20)
接下来H行,每行包含W个字符,字符含义如下:
‘.’表示黑地砖;
‘#’表示红地砖;
‘@’表示小明一开始站的位置,此位置是一块黑地砖,并且这个字符在每组输入中仅会出现一个。
当W=0,H=0时,输入结束。
每组输入首先是两个正整数W和H,分别表示地砖的列行数。(1<=W,H<=20)
接下来H行,每行包含W个字符,字符含义如下:
‘.’表示黑地砖;
‘#’表示红地砖;
‘@’表示小明一开始站的位置,此位置是一块黑地砖,并且这个字符在每组输入中仅会出现一个。
当W=0,H=0时,输入结束。
输出
对于每组输入,输出小明可以走到的黑色地砖最多有多少块,包括小明最开始站的那块黑色地砖。
样例输入 Copy
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0
样例输出 Copy
45
59
6
13
代码:
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <vector> using namespace std; void DFS(int x,int y); char temp[25][25]; int X[4] ={0,0,1,-1}; int Y[4] ={1,-1,0,0}; int sx,sy; int m,n; int ans; int main(){ while(cin>>m>>n){ ans = 0; if(m==0&&n==0){ break; } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>temp[i][j]; if(temp[i][j]=='@'){ sx = i; sy = j; } } } DFS(sx,sy); cout<<ans<<endl; } return 0; } void DFS(int x,int y){ ans++; temp[x][y]='#'; for(int i=0;i<4;i++){ int newx = x+X[i]; int newy = y+Y[i]; if(newx>=0&&newy>=0&&newx<n&&newy<m&&temp[newx][newy]=='.'){ DFS(newx,newy); } } }