标签:imu http strong diff str cto one cout 01背包
Input
The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, K(N <= 100 , V <= 1000 , K <= 30)representing the number of bones and the volume of his bag and the K we need. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
Output
One integer per line representing the K-th maximum of the total value (this number will be less than 2 31).
Sample Input
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
Sample Output
12 2 0
题目大意:
输入n,v,k分别代表n个物品,v的体积,以及要求v能装下第k大的价值。
01背包变形,加一维代表第几大,最后dp[v][k]即为答案。
#include <iostream> #include <cstring> using namespace std; int v[105],w[105]; int dp[1005][35],a[35],b[35]; int n,val,k; int main() { int T; cin>>T; while(T--) { memset(dp,0,sizeof dp); cin>>n>>val>>k; for(int i=1;i<=n;i++) cin>>v[i]; for(int i=1;i<=n;i++) cin>>w[i]; for(int i=1;i<=n;i++) for(int j=val;j>=w[i];j--) { for(int l=1;l<=k;l++) { a[l]=dp[j][l];///不取 b[l]=dp[j-w[i]][l]+v[i];//取 } a[k+1]=b[k+1]=-1; int x=1,y=1,z=1; while(z<=k&&(x<=k||y<=k))///更新,也可以直接排序 { if(a[x]>b[y]) dp[j][z]=a[x++]; else dp[j][z]=b[y++]; if(dp[j][z]!=dp[j][z-1]) z++; } } cout<<dp[val][k]<<‘\n‘; } return 0; }
标签:imu http strong diff str cto one cout 01背包
原文地址:https://www.cnblogs.com/zdragon1104/p/9189080.html