poj2063 Investment(完全背包)

来源:互联网 发布:封面制作软件ios 编辑:程序博客网 时间:2024/05/22 06:35

原题: http://poj.org/problem?id=2063

思路:因为bond的价格是1000的倍数,所以把总钱数和bond的价格压缩1000倍,再进行完全背包就可以了。

//完全背包#include<cstdio>#include<memory.h>int main(){int t;const int bei=1000;scanf("%d",&t);while(t--){int money,year;scanf("%d %d",&money,&year);int rest=money%bei;money=money/bei;int n;scanf("%d",&n);int w[12];int v[12];int dp[100010]={0};for(int i=1;i<=n;i++){scanf("%d %d",&w[i],&v[i]);w[i]=w[i]/bei;for(int j=w[i];j<=money;j++)//第一年 {if(dp[j]<dp[j-w[i]]+v[i]){dp[j]=dp[j-w[i]]+v[i];}}}rest=rest+dp[money];money=money+rest/bei;rest=rest%bei;for(int k=2;k<=year;k++){memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++){for(int j=w[i];j<=money;j++){if(dp[j]<dp[j-w[i]]+v[i]){dp[j]=dp[j-w[i]]+v[i];}}}rest=rest+dp[money];money=money+rest/bei;rest=rest%bei;}printf("%d\n",money*bei+rest);}return 0;}