hdu 2660

题意:从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 }
原文地址:https://www.cnblogs.com/hhxj/p/7447701.html