网易游戏2013年校园招聘笔试题) -- 动态规划

来源:互联网 发布:淘宝买房子 编辑:程序博客网 时间:2024/05/19 04:51

http://blog.csdn.net/jdplus/article/details/20203641


题目地址:http://ac.jobdu.com/problem.php?pid=1531

题目描述:

小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在游戏中购买各种装备来提升自己。有一天,他突然很想知道这些纸币的组合不能表示的最小面额是多少,请聪明的你来帮助小虎来解决这个财政问题吧。

输入:

输入包含多个测试用例,每组测试用例的第一行输入一个整数N(N<=100)表示流通的纸币面额数量,第二行是N个纸币的具体表示面额,取值[1,100]。

输出:

对于每组测试用例,输出一个整数,表示已经发行的所有纸币都不能表示的最小面额(已经发行的每个纸币面额最多只能使用一次,但面值可能有重复)。

样例输入:
51 2 3 9 10051 2 4 9 10051 2 4 7 100
样例输出:
7815

使用0-1背包来解:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.    
  5. int N;  
  6. int value[101];  
  7. int dp[10001];  
  8. int max;  
  9.      
  10. int Compare(const void * p, const void * q){  
  11.     return *(int *)p - *(int *)q;  
  12. }  
  13.      
  14. int Max(int a, int b){  
  15.     return (a > b) ? a : b;  
  16. }  
  17.      
  18. int ZeroOnePack(){  
  19.     int i, j;  
  20.     memset(dp, 0, sizeof(dp));  
  21.     for (i = 1; i <= N; ++i){  
  22.         for (j = max; j >= value[i]; --j){  
  23.             dp[j] = Max(dp[j], dp[j-value[i]] + value[i]);  
  24.         }  
  25.     }  
  26.     for (i = 1; i <= max; ++i)  
  27.         if (dp[i] != i)  
  28.             return i;  
  29. }  
  30.      
  31. int main(void){  
  32.     int i;  
  33.      
  34.     while (scanf("%d", &N) != EOF){  
  35.         max = 0;  
  36.         for (i = 1; i <= N; ++i){  
  37.             scanf("%d", &value[i]);  
  38.             max += value[i];  
  39.         }  
  40.         qsort(value, N, sizeof(int), Compare);  
  41.         printf("%d\n", ZeroOnePack());  
  42.     }  
  43.      
  44.     return 0;  
  45. }  

第二种解法:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //动态规划的思想, 对于从第1个到第i个数的和total,  
  2. //如果第i+1个数大于total+1则不会组成total+1.   
  3. #include <stdio.h>  
  4. #include <stdlib.h>  
  5.   
  6. int Compare(const void * p, const void * q){  
  7.     return *(int *)p - *(int *)q;  
  8. }  
  9.   
  10. int main(void){  
  11.     int N;  
  12.     int value[100];  
  13.     int i;  
  14.     int ans;  
  15.   
  16.     while (scanf("%d", &N) != EOF){  
  17.         for (i = 0; i < N; ++i){  
  18.             scanf("%d", &value[i]);  
  19.         }  
  20.         qsort(value, N, sizeof(int), Compare);  
  21.         ans = 0;  
  22.         for (i = 0; i < N; ++i){  
  23.             if (value[i] > ans + 1){  
  24.                 break;  
  25.             }  
  26.             else  
  27.                 ans += value[i];  
  28.         }  
  29.         printf("%d\n", ans + 1);  
  30.     }  
  31.   
  32.     return 0;  
  33. }  


九度OJ上相似的题目:两船载物问题, CODE代码片

                                    V字仇杀队,CODE代码片

参考资料:背包问题九讲


0 0
原创粉丝点击