hdu 2602 Bone Collector 01双肩包
hdu 2602 Bone Collector 01背包
经典的01背包问题,去年集训的时候没有做出来的题目,原来是如此简单。。。
思路:
dp[i+1][j]代表选前i个骨头总容量不超过j的最大价值,所以可得到状态方程
|dp[i+1][j] = dp[i][j](vol[i] > j当前i的容量大于j) |
|dp[i+1][j] = max{dp[i][j],dp[i][j-vol[i]]+val[i]}|(当前i的容量小于j,只存在装与不装第i个骨头,所以选择最大的即可)
贴代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<vector> #include<set> #include<string> #include<algorithm> using namespace std; int dp[1005][1005]; int vol[1005]; int val[1005]; int main() { int T,v,i,j,n; cin >> T; while(T--) { cin >> n >> v; for(i=1; i<=n; i++) cin >> val[i]; for(i=1; i<=n; i++) cin >> vol[i]; for(i=0; i<=v; i++) dp[1][i] = 0; for(i=1; i<=n; i++) { for(j=0; j<=v; j++) { if(j < vol[i]) dp[i+1][j] = dp[i][j]; else dp[i+1][j] = max(dp[i][j],dp[i][j-vol[i]]+val[i]); } } cout << dp[n+1][v] << endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。