思路:
这题正解好像是多重背包
但是这n这么小貌似dfs也是可以的,加个最优化剪枝就过了
C o d e Code Code:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
double p[50];
int ans,n,m,v[50],q[50],h[50],g[50];
void dfs(int dep,int s,int t)//搜到当前dep所得分数剩余时长t
{
if (dep > n)
{
if (s > ans) ans = s; //找到方案
return;
}
if (t * p[dep] + s < ans) return; //最优化剪枝
dfs(dep + 1, s, t);
if (v[dep] <= t) dfs(dep + 1,s + q[dep],t - v[dep]); //搜
if (h[dep] <= t) dfs(dep + 1,s + g[dep],t - h[dep]);
}
void px(){//排序,别问我为啥不用sort
int i, j, t;
double x;
for (i = 1;i <= n - 1; i++)
for (j = i + 1; j <= n; j++)
if (p[i] < p[j])
{
x = p[i]; p[i] = p[j]; p[j] = x;
t = q[i]; q[i] = q[j]; q[j] = t;
t = v[i]; v[i] = v[j]; v[j] = t;
t = g[i]; g[i] = g[j]; g[j] = t;
t = h[i]; h[i] = h[j]; h[j] = t;
}
}
int main()
{
double x;
scanf("%d%d",&n, &m);
for (int i = 1;i <= n;i++)
{
scanf("%d%d%d%d", &q[i], &v[i], &g[i], &h[i]);
p[i] = (double)q[i] * 1.0 / v[i];//比值
x = (double)g[i] * 1.0 / h[i];
if (x > p[i]) p[i] = x;
}
px();//排序
dfs(1, 0, m);//搜
printf("%d", ans);
return 0;
}