这题对我来说有些难,参考了学长的代码,所以让我写“我的思路”肯定会心虚的,就把原文地址贴过来了。核心思想是用f[i]表示能叠 i 层时最轻的总重量,每次扫描的时候都会更新f[i]。这是原文:http://www.cnblogs.com/staginner/archive/2011/11/30/2268497.html

代码自己改了一下,本来想把qsort改成sort的,但是毕竟很久没接触qsort了,就没做太大的改动,当作复习qsort。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #define MAXN 5700
 5 #define INF 1000000
 6 int w[MAXN],s[MAXN],r[MAXN],f[MAXN];
 7 int cmp(const void *_q,const void *_p)
 8 {
 9     int *q = (int *)_q;
10     int *p = (int *)_p;
11     return s[*q] - s[*p];
12 }
13 int main()
14 {
15     int i,j,max,n = 0;
16     while(scanf("%d%d",&w[n],&s[n])==2)
17         if(s[n] >= w[n])
18             n++;
19     for(i = 0; i <= n; i++)
20         f[i] = INF, r[i] = i;
21     f[0] = max = 0;
22     qsort(r,n,sizeof(r[0]),cmp);
23     for(i = 0; i < n; i++)
24         for(j = max; j >= 0; j--)
25         {
26             if(w[r[i]] + f[j] <= s[r[i]] && f[j] + w[r[i]] < f[j+1])
27             {
28                 f[j+1] = f[j] + w[r[i]];
29                 if(j+1 > max)
30                     max = j+1;
31             }
32         }
33     printf("%d\n",max);
34     return 0;
35 }