标签:iostream stdio.h ring math vol name scanf scan show
InputThe 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.
OutputOne 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
题目意思:0/1背包的变形,求第N优解
解题思路:储存每一次的变化;
1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 #include<math.h>
5 #include <algorithm>
6 using namespace std;
7
8 const int MAX = 2000;
9
10 int main()
11 {
12 int N;
13 cin>>N;
14 while(N--)
15 {
16 int n,m,ti;
17 scanf("%d %d %d",&n,&m,&ti);
18
19 int w[MAX],v[MAX];
20 for(int i =1;i<=n;i++)
21 scanf("%d",&v[i]);
22
23 for(int j = 1;j <=n;j++)
24 scanf("%d",&w[j]);
25
26 int tab[MAX][MAX],a[MAX],b[MAX];
27 memset(tab,0,sizeof(tab));
28 for(int i =1;i <=n;i++)
29 {
30 for(int j =m;j>=w[i];j--)
31 {
32 for(int k =1; k<=ti;k++)
33 {
34 a[k] = tab[j-w[i]][k]+v[i];
35 b[k] = tab[j][k];
36 }
37 a[ti+1]=-1;
38 b[ti+1] =-1;
39 int x,y,z;
40 x= y =z= 1;
41 while(z<=ti&&(a[x]!=-1||b[y]!=-1))
42 {
43 if(a[x]>b[y])
44 tab[j][z] = a[x++];
45 else
46 tab[j][z] = b[y++];
47
48 if(tab[j][z]!=tab[j][z-1])
49 z++;
50 }
51 }
52 }
53 cout<<tab[m][ti]<<endl;
54
55 }
56
57
58 return 0;
59 }
标签:iostream stdio.h ring math vol name scanf scan show
原文地址:http://www.cnblogs.com/a2985812043/p/7375640.html