WooKinson

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
问题描述
  有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
  要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入格式
  第一行为一个整数,表示箱子容量;
  第二行为一个整数,表示有n个物品;
  接下来n行,每行一个整数表示这n个物品的各自体积。
输出格式
  一个整数,表示箱子剩余空间。
  样例输入
  24
  6
  8
  3
  12
  7
  9
  7
样例输出
0

 

记:

一开始使用的思路有点像dfs,不符合动态规划的思想

故上网查阅他人的代码

(代码参考:https://blog.csdn.net/s2637281620/article/details/63251166)

学习到了滚动数组的使用,拓展了动态规划的解题思路

 

AC代码:

 1 #include <stdio.h>
 2 #define LEN 20000
 3 
 4 int v,n;
 5 int use[LEN+1] = {0};
 6 int ans[LEN+1] = {0};
 7 
 8 void init()
 9 {
10     int i;    
11     scanf("%d",&v);
12     scanf("%d",&n);
13     for (i = 1 ; i <= n ; i ++)
14     {
15         scanf("%d",&use[i]);
16     }    
17     return ;
18 }
19 
20 void dp()
21 {
22     int i,j;
23     for (i = 1 ; i <= n ; i ++)/*遍历物品的体积*/
24     {
25         /*
26             在允许范围内, 
27             将当前物品加入到箱子中,
28             若加入后的体积大于原值,则加入物品,并更新值 
29         */
30         for (j = v ; j >= use[i] ; j --)
31         {
32             if (ans[j-use[i]] + use[i] > ans[j])
33             {
34                 ans[j] = ans[j-use[i]] + use[i];
35             }
36         }
37     }
38     return ;
39 }
40 
41 int main(void)
42 {    
43     init();
44     dp();    
45     printf("%d",v-ans[v]);
46     return 0;
47 }

 

posted on 2018-04-10 10:39  WooKinson  阅读(332)  评论(0编辑  收藏  举报