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]);
没有未来的未来不是我想要的未来

浙公网安备 33010602011771号