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 }