Acwing题库刷题【day13】A + B,01背包,动态规划,特别特别难的题

一,A+B

输入两个整数,求这两个整数的和是多少。

输入格式
输入两个整数A,B,用空格隔开

输出格式
输出一个整数,表示这两个数的和

数据范围 0≤A,B≤108

样例输入:

3 4

样例输出:

7

c++代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b;
    cin>>a>>b;
    cout<<a+b;

}

心得:简单题

二,01背包,动态规划

01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn。01背包是背包问题中最简单的问题。01背包的约束条件是给定几种物品,每种物品有且只有一个,并且有权值和体积两个属性。在01背包问题中,因为每种物品只有一个,对于每个物品只需要考虑选与不选两种情况。如果不选择将其放入背包中,则不需要处理。如果选择将其放入背包中,由于不清楚之前放入的物品占据了多大的空间,需要枚举将这个物品放入背包后可能占据背包空间的所有情况。
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式
输出一个整数,表示最大价值。

数据范围 0<N,V≤1000 0<vi,wi≤1000

输入样例

4 5
1 2
2 4
3 4
4 5

输出样例:

8

c++解题:

#include<bits/stdc++.h>

using namespace std;

const int MAXN = 1005;
int v[MAXN];    // 体积
int w[MAXN];    // 价值 
int f[MAXN][MAXN];  // f[i][j], j体积下前i个物品的最大价值 

int main() 
{
    int n, m;   
    cin >> n >> m;
    for(int i = 1; i <= n; i++) 
        cin >> v[i] >> w[i];

    for(int i = 1; i <= n; i++) 
        for(int j = 1; j <= m; j++)
        {
            //  当前背包容量装不进第i个物品,则价值等于前i-1个物品
            if(j < v[i]) 
                f[i][j] = f[i - 1][j];
            // 能装,需进行决策是否选择第i个物品
            else    
                f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
        }           

    cout << f[n][m] << endl;

    return 0;
}

三,特别特别难的题

时间限制:1Sec内存限制:128MB通过:28提交:53
题目描述

这是一道特别特别难得题,当你点开的时候,建议立刻关掉去做别的题,这是一个非常非常难的题,需要花费大量的脑细胞去思考它,下面请看题。

输入长度为N和整数大小的数组a,请打印首先出现的数组的每个元素,长度为大小

输入

第一行包含两个整数 n 和大小。

第二行包含 n 个整数 a [i],表示整个数组。

输出

总共有一行,包括大小整数,指示数组的第一个大小。

样例输入

5 3
1 2 3 4 5

样例输出

1 2 3

c++解题方法:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    int a[10000],b[10000],b1=0;
    for (int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    for (int i=0;i<n;i++)
    {
        int j;
        for(j=0;j<m;j++)
        {
            if(a[i]==b[j])
            {
                break;
            }
        }
        if(j>=m)
        {
            b[b1]=a[i];
            b1++;
        }
        if(b1>=m)
        {
            break;
        }
    }
    for(int i=0;i<b1;i++)
    {
        cout<<b[i]<<" ";
    }


}
上一篇:SQLSERVER拆分字符串的函数(表值函数)


下一篇:【51CTO/BBS】请教: SQL里有没有字符串分解Split的函数??