Pick apples sdut 2408 (V 超大的背包)
大范围贪心,小范围背包
#include<stdio.h> #include<string.h> long long d[2100]; int max_num(int a,int b) { return a>b?a:b; }; int main() { long long i,j; long long m,w[10],p[10],v,n; double val,max; int id,x=1,t; scanf("%d",&t); while(t--) { max=0; for(i=1; i<=3; i++) { scanf("%lld%lld",&w[i],&p[i]); val=p[i]*1.0/w[i];//p和w弄反了,结果wrong了12遍 if(val>max) {id=i; max=val;} } scanf("%lld",&v); memset(d,0,sizeof(d)); m=0; if(v>1000) { n=(v-1000)/w[id]; m=n*p[id]; v-=n*w[id]; } for(i=1; i<=3; i++) for(j=w[i]; j<=v; j++) d[j]=max_num(d[j],d[j-w[i]]+p[i]); printf("Case %d: %lld\n",x,m+d[v]); x++; } return 0; }
v大于1000,时先用贪心将性价比最高的填充,再用背包。