问题描述 有一个箱子容量为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 }