不行呀 , 看了半天了 人家的 代码还没看懂 , 先放下 明天再看看吧.
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 #include<limits.h> 15 using namespace std; 16 struct Node 17 { 18 int w,x; 19 }A[1010]; 20 int dp[10010]; 21 bool cmp(Node a,Node b) 22 { //先将放时占用位置较大的先放上 23 return a.x-a.w>b.x-b.w; // 先让那些需要挪腾空间大的 , 排在前面 就是 上一个挪腾空间+下一个占用空间大的在前面 24 } 25 int main() 26 { 27 int n,l,i,j,k; 28 while(scanf("%d%d",&n,&l)!=EOF) 29 { 30 for(i=0;i<n;++i) 31 { 32 scanf("%d%d",&A[i].w,&A[i].x); 33 } 34 sort(A,A+n,cmp); 35 memset(dp,0,sizeof(dp)); 36 int ans=0; 37 for(i=0;i<n;i++) // 一个一个 的 物品向下传输 38 { 39 for(j=l;j>=A[i].w;j--) // 如果不够放置的空间就退出去 40 { 41 if(l>=A[i].x+j-A[i].w) // 将if 注释掉之后 就变成了 最简单的 背包 42 { 43 dp[j]=max(dp[j],dp[j-A[i].w]+A[i].w); 44 ans=max(dp[j],ans); 45 } 46 } 47 } 48 printf("%d\n",ans); 49 } 50 return 0; 51 }