题意:从n个物品中选出k个,给出每个物品的价值,重量,并且重量不能超过w
思路:dp[i][j]表示重量为i时选j个的最大价值
dp[i][j]=max(dp[i][j],dp[i-b[k]][j-1]+a[k]],
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int a[30],b[30]; 5 6 int dp[1002][30]; 7 8 int main(){ 9 int t; 10 cin>>t; 11 while(t--){ 12 int n,k; 13 scanf("%d%d",&n,&k); 14 memset(dp,0,sizeof(dp)); 15 for(int i=1;i<=n;i++) { 16 scanf("%d%d",&a[i],&b[i]); 17 } 18 int w; 19 scanf("%d",&w); 20 for(int i=1;i<=n;i++){ 21 for(int j=w;j>=b[i];j--){ 22 for(int x=1;x<=k;x++){ 23 dp[j][x]=max(dp[j][x],dp[j-b[i]][x-1]+a[i]); 24 } 25 } 26 } 27 cout<<dp[w][k]<<endl; 28 } 29 }
DFS
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int a[30],b[30]; 5 int Max; 6 int n,k; 7 int w; 8 9 void hh(int x,int y,int we,int val){ 10 if(y==k&&we<=w){ 11 Max=max(Max,val);return ; 12 } 13 for(int i=x+1;i<=n;i++){ 14 if(y+1<=k&&we+b[i]<=w){ 15 hh(i,y+1,we+b[i],val+a[i]); 16 } 17 } 18 } 19 20 int main(){ 21 int t; 22 cin>>t; 23 while(t--){ 24 scanf("%d%d",&n,&k); 25 for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); 26 Max=0; 27 scanf("%d",&w); 28 hh(0,0,0,0); 29 printf("%d ",Max); 30 } 31 }