poj 2063 Investment

题目描述:...

分析:因为不同年份之间没有什么互相影响,所以可用完全背包求解,唯一不同的就是每年的背包容量都在变大。

  另外由于物品价钱都是1000的倍数,所以可以同时除以1000,减少内存。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define N 100010
 6 using namespace std;
 7 int dp[N],w[N],v[N];
 8 int main(){
 9     int t;
10     cin>>t;
11     while(t--){
12         int n,cnt,m;
13         cin>>m>>cnt;
14         cin>>n;
15         for(int i=1;i<=n;i++){
16             cin>>w[i]>>v[i];
17             w[i]/=1000;
18         }
19         int ans=m;
20         m/=1000;
21         memset(dp,0,sizeof(dp));
22         for(int i=1;i<=cnt;i++){
23             for(int j=1;j<=n;j++)
24                 for(int k=w[j];k<=m;k++)
25                     dp[k]=max(dp[k],dp[k-w[j]]+v[j]);
26                 ans+=dp[m];
27                 m=ans/1000;
28         }
29         cout<<ans<<endl;
30     }
31     return 0;
32 }

 

posted @ 2012-10-20 22:00  silver__bullet  阅读(115)  评论(0编辑  收藏  举报