#include<iostream>
#define int long long
const int N = 260;
const int W = 1010;
int dp[N][W][2],t[N],n,w[N],XW;
signed main(){
scanf("%lld%lld",&n,&XW);
for(int i = 1;i <= n;i ++){
scanf("%lld%lld",w + i,t + i);
}
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= XW;j ++){
if(i != 1){
int way1 = (dp[i - 1][j][1] + t[i]) * 1000 / (dp[i - 1][j][0] + w[i]);
int way2 = dp[i - 1][j][1] * 1000 / dp[i - 1][j][0];
if(way1 > way2){
dp[i][j][0] = dp[i - 1][j][0] + w[i];
dp[i][j][1] = dp[i - 1][j][1] + t[i];
}
else{
dp[i][j][0] = dp[i - 1][j][0];
dp[i][j][1] = dp[i - 1][j][1];
}
}
else{
dp[i][j][0] = w[i];
dp[i][j][1] = t[i];
}
}
}
printf("%lld",dp[n][XW][1] * 1000 / dp[n][XW][0]);
return 0;
}
比贪心都弱?
#include<iostream>
#include <algorithm>
const int N = 260;
struct cow{
int w,t;
double v;
}cows[N];
int W,n,sumW,sumT;
bool cmp(cow x,cow y){
if(x.v != y.v)return x.v < y.v;
return x.t < y.t;
}
int main(){
scanf("%d%d",&n,&W);
for(int i = 1;i <= n;i ++){
scanf("%d%d",&cows[i].w,&cows[i].t);
cows[i].v = cows[i].w * 1.0 / cows[i].t;
}
std::sort(cows + 1,cows + n + 1,cmp);
for(int i = 1;i <= n;i ++){
sumW += cows[i].w;
sumT += cows[i].t;
if(sumW >= W) break;
}
if(sumW < W) printf("0");
else printf("%d",sumT * 1000 / sumW);
return 0;
}