2224Investment——zoj

来源:互联网 发布:四度空间软件 编辑:程序博客网 时间:2024/05/29 14:51
债券可以无限购买   94一个完全背包

但是计算出来  发现空间如果开成数组  绝对mle
他说xi和n都是1000倍数
就用 dp[i]表示 i*1000个空间所获得最大价值就好


有一个小优化

对于每一年重新购买的债券 
可以定义一个start 和 end 
表示当前年限的起始空间 和  最大空间
start就是上一个end
end就是end加上在上一个end下获得的价值

就可以实现优化 

#include<iostream>#include<cstdio>#include<cstring>#define MAXN 50000+10using namespace std;int t,n,y,d;int a[MAXN];//前i*1000空间 最大价值 int v[20];int w[20];int st,en;void readdata(){memset(a,0,sizeof(a));scanf("%d%d%d",&n,&y,&d);for(int i=1;i<=d;i++)scanf("%d%d",&v[i],&w[i]);st=1*1000;en=n;}void solve(){for(int i=1;i<=d;i++)for(int j=st;j/1000<=en/1000;j+=1000){if(j-v[i]<0)continue;a[j/1000]=max(a[j/1000],a[(j-v[i])/1000]+w[i]);}}int main(){scanf("%d",&t);for(int tt=1;tt<=t;tt++){readdata();for(int i=1;i<=y;i++){solve();st=en;en=en+a[en/1000];}printf("%d\n",en);}}




0 0
原创粉丝点击