标签:hdu2639 bone collector i acm dp 01背包
3 5 10 2 1 2 3 4 5 5 4 3 2 1 5 10 12 1 2 3 4 5 5 4 3 2 1 5 10 16 1 2 3 4 5 5 4 3 2 1
12 2 0这样的问题,背包九讲里提到过。不行的去这个博客看吧。http://www.2cto.com/kf/201305/214139.html 不过我感觉我的代码比他写的清楚。#include <cstdio> #include <cstring> #define MAX 1100 using namespace std ; int dp[MAX][40],value[MAX],volume[MAX] , t1[40],t2[40]; int main() { int c; scanf("%d",&c) ; while(c--) { int n , v , k ; scanf("%d%d%d",&n,&v,&k) ; for(int i = 0 ; i < n ; ++i) { scanf("%d",&value[i]) ; } for(int i = 0 ; i < n ; ++i) { scanf("%d",&volume[i]) ; } memset(dp,0,sizeof(dp)) ; for(int i = 0 ; i < n ; ++i) { for(int j = v ; j >= volume[i] ; --j) { for(int m = 1 ; m <= k ; ++m) { t1[m] = dp[j][m] ; t2[m] = dp[j-volume[i]][m] + value[i]; } t1[k+1] = t2[k+1] = -1 ; int a = 1, b = 1 ; //下面是合并。 for(int m = 1 ; (a<=k||b<=k)&&m <= k ;) { if(t1[a]>t2[b]) dp[j][m] = t1[a++] ; else { dp[j][m] = t2[b++] ; } if(dp[j][m] != dp[j][m-1]) ++m ; } } } printf("%d\n",dp[v][k]) ; } return 0 ; }
hdu 2639 Bone Collector II 01背包问题 求第K大最优值。。
标签:hdu2639 bone collector i acm dp 01背包
原文地址:http://blog.csdn.net/lionel_d/article/details/43709501