题目大意:跟01背包模型有点像,区别在于01背包对选取的物品个数没有要求,而这题给出了选的个数。N最大为20,所以可以暴力过。
经测试N最大好像是21,定义成20会WA
View Code
1 #include <stdio.h> 2 #define N 21 3 #define INF 0x7fffffff 4 int v[N],w[N],n,m,cnt,vmax,wmax; 5 void dfs(int k,int vsum,int wsum) 6 { 7 if(cnt==m) 8 { 9 if(wsum<=wmax && vsum>vmax) vmax=vsum; 10 return; 11 } 12 for(int i=k+1;i<n;i++) 13 { 14 cnt++; 15 dfs(i,vsum+v[i],wsum+w[i]); 16 cnt--; 17 } 18 } 19 int main() 20 { 21 int t; 22 scanf("%d",&t); 23 while(t--) 24 { 25 scanf("%d%d",&n,&m); 26 for(int i=0;i<n;i++) scanf("%d%d",&v[i],&w[i]); 27 scanf("%d",&wmax); 28 vmax=-INF; 29 for(int i=0;i<n;i++) 30 { 31 cnt=1; 32 dfs(i,v[i],w[i]); 33 } 34 vmax=(vmax==-INF)?0:vmax; 35 printf("%d\n",vmax); 36 } 37 return 0; 38 }