DAY3 - T1 A plan

T1:A plan

题目

题目描述

章北蚤正在采集能源。他的任务是采集 n 个单位的燃料。 他有 m 点体力,最多进行 s 次采集。
他的体力降到 0 或 0 一下,就无法再采集能源。
一共有 k 种能源。(每种能源无限个)
每一次采集得到 x 个单位燃料,消耗 y 点体力。(0<x,y<20) 求他完成任务后最多能剩多少体力。若不能完成输出-1。

输入

输入文件为 a.in。 第一行包含用空格隔开的三个整数 n,m,k,s 接下来 k 行每行两个数 x,y

输出

输出文件为 a.out。 一个整数。

样例

数据

对于前 10% 的数据,满足 k=1
对于前 50% 的数据,满足 k<=20 对于 100%的数据,满足 n,m,s,k<100

题解

DFS

#include <bits/stdc++.h>
using namespace std;

int n, m, k, s, dp[110][21], maxn = -1;
struct node{
    double p, x, y;
}a[110];

bool cmp(node A, node B){
    if(A.p > B.p){
        return true;
    }
    swap(A, B);
    return false;
}

void dfs(int I, double N, int M){
    if(M <= 0){
        if(N <= 0){
            maxn = maxn < M ? M : maxn;
        }
        return ;
    }
    if(N <= 0){
        maxn = maxn < M ? M : maxn;
        return ;
    }
    if(I > k){
        return ;
    }
    //2⃣️
    if(M < maxn){
        return ;
    }
    for(int i = N / a[I].x+1; i >= 0; i--){

        dfs(I+1, N - a[I].x * i, M-a[I].y*i);
    }
    return ;
}

int main(){
    scanf("%d%d%d%d", &n, &m, &k, &s);
    for(int i = 1; i <= k; i++){
        scanf("%lf%lf", &a[i].x, &a[i].y);
        a[i].p = a[i].x / a[i].y;

    }
    sort(a+1, a+k+1, cmp);
    dfs(1, n, m);
    //1⃣️
    if(maxn == 0){
        printf("-1\n");
        return 0;
    }
    printf("%d\n", maxn);
    return 0;
}
//1⃣️ 当 maxn = 0 时,即无解,应输出 -1
//2⃣️ 剪枝(减少复杂度)
if(M < maxn){
    return ;
}

动态规划(AC)

dp[i][j]: i点体力 j次采集
状态转移方程:
    dp[i][j] = max(dp[i][j], dp[i-w[k]][j-1]+v[k]);
posted @ 2020-08-05 10:40  LT-Y  阅读(66)  评论(0)    收藏  举报