跳格子 完全背包

sdut  2594

毛线除了泡妹子以外最喜欢的就是玩些无聊的游戏了。他最近又迷上了一个非常无聊的游戏,那就是...跳格子。他在墙边画了许许多多的格子,每次从外面往墙的那边跳,使自己更加靠近墙。
为了增加下游戏的难度,毛线每次跳之前会规定下自己每次能跳几个格子,然后试着让自己在这个限制下最靠近墙。
 

输入

 输入包含多组数据,对于每组测试数据:
第一个给出格子的总数 N(1<=N<=1000000),然后是 M(M<=10),接下来 M 行每行一个数 K(K<=N),表示毛线可以一次跳 K 格。
 

输出

 输出毛线最远可以跳到的地方离墙还有多少个格子。
 

示例输入

11 3
5
7
8
100 5
81
71
61
51
21

示例输出

1
7

提示

 第一组数据,毛线可以跳两次 5 格,这样距墙只有一格
第二组数据,毛线可以先跳 51 格,再跳两次 21 个,这样距墙只有 7 格
 1 #include<stdio.h>   
 2 #include<string.h>   
 3 int c[20],dp[1000010];   
 4 int main ()   
 5 {   
 6     int n,m;   
 7     while(~scanf("%d %d",&n,&m))   
 8     {   
 9         for(int i = 0; i < m; i++)   
10             scanf("%d",&c[i]);   
11         memset(dp,0,sizeof(dp));   
12         dp[0] = 1;   
13         for(int i = 0; i < m; i++)   
14             for(int j = c[i]; j <= n; j++) //顺序排列  
15                 if(dp[j-c[i]])   
16                     dp[j] = 1;   
17         for(int i = n; i >= 0; i--)   
18             if(dp[i])   
19             {   
20                 printf("%d\n",n-i);   
21                 break;   
22             }   
23     }   
24     return 0;   
25 }   

 

posted on 2013-05-11 20:48  straw_berry  阅读(169)  评论(0编辑  收藏  举报