题意:海滩上有n个石头,每个石头有两个值 a,b ,每取一个石头,所有石头的a值都要减去取的那个石头的b值(不包括已经取到过的了),问你最后你能取到石头a的和的最大值是多少;
解题思路:1,我们可以知道,在选取同样的石头中,b值小的我们是必需要先取的才能狗得到最大值,所以我们先对石头的b值进行排序,然后再进行dp,dp[i][j]表示 i 之后还有多少个石头要取,如果要取这个时候 得到的值 为 a[i] - j*b[i];
解题代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 struct node 5 { 6 int a,b; 7 int c; 8 }a[1010]; 9 int dp[1004][1004]; 10 int cmp(const void * a,const void *b) 11 { 12 return (*(node *)a).b - (*(node *)b).b; 13 } 14 int main() 15 { 16 int n; 17 while(scanf("%d",&n)!=EOF&&n!=0) 18 { 19 memset(a,0,sizeof(a)); 20 for(int i= 1;i<=n;i++) 21 { 22 scanf("%d %d",&a[i].a,&a[i].b); 23 } 24 memset(dp,0,sizeof(dp)); 25 qsort(a+1,n,sizeof(node),cmp); 26 for(int i = 1; i <= n ;i ++) 27 { 28 29 for(int j = 0 ;j <= n;j ++) 30 { 31 if(dp[i-1][j] > dp[i-1][j+1] + a[i].a - (j) * a[i].b) 32 dp[i][j] = dp[i-1][j]; 33 else dp[i][j] = dp[i-1][j+1] + a[i].a - (j) * a[i].b; 34 } 35 } 36 printf("%d ",dp[n][0]); 37 } 38 return 0; 39 }