一、问题:

输入:

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时,输入结束。

输出

对于每组输入,输出小明可以走到的黑色地砖最多有多少块,包括小明最开始站的那块黑色地砖。

样例输入 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);
        }
    }
}

 

posted on 2020-02-28 17:22  晨曦生辉耀匕尖  阅读(305)  评论(0编辑  收藏  举报