题意:这题就是一个纯粹的裸01背包
分析:WA了好几次,01背包实现的一些细节没搞懂
1.为什么dp[i][j]赋初值为0而不是value[i],因为第i个石头可能不放!
2.在进行状态转移之前要dp[i][j]=dp[i-1][j],不然肯定会WA啊,想想就明白了
3.最终结果是dp[n][v],不是每次求mx,因为状态转移就是这么推的啊
代码:
#include<iostream> #include<cstring> #include<cmath> using namespace std; long long dp[1001][1001],va[1001],mx; int t,n,v,vo[1001]; int main() { cin>>t; while(t--){ cin>>n>>v; mx=-1; for(int i=1;i<=n;i++) cin>>va[i]; for(int i=1;i<=n;i++) cin>>vo[i]; for(int i=1;i<=n;i++) for(int j=0;j<=v;j++) dp[i][j]=0; //错误1 for(int i=1;i<=n;i++){ for(int j=0;j<=v;j++){ dp[i][j]=dp[i-1][j]; //错误2 if(vo[i]<=j) dp[i][j]=dp[i][j]>dp[i-1][j-vo[i]]+va[i]?dp[i][j]:dp[i-1][j-vo[i]]+va[i]; } } mx=dp[n][v]; //错误3 cout<<mx<<endl; } }
!HDU 2602 Bone Collector--DP--(裸01背包)
原文地址:http://blog.csdn.net/ac_0_summer/article/details/46351007