f[i][j]:1~i物品中是否可以达到j
f[i][j]=f[i-1][j+a[i]]||f[i-1][j-a[i]] (如果合法)


1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <map> 6 #include <string> 7 #include <vector> 8 #include <stack> 9 #include <cmath> 10 #include <queue> 11 #include <cstdio> 12 using namespace std; 13 14 int n,a[1100],beg,en; 15 bool f[60][1100]; 16 int main(){ 17 scanf("%d%d%d",&n,&beg,&en); 18 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 19 f[0][beg]=1; 20 for(int i=1;i<=n;i++) 21 for(int j=0;j<=en;j++) 22 { 23 if(j-a[i]>=0&&f[i-1][j-a[i]])f[i][j]=1; 24 if(j+a[i]<=en&&f[i-1][j+a[i]])f[i][j]=1; 25 } 26 for(int i=en;i>=0;i--)if(f[n][i]){printf("%d\n",i);return 0;} 27 printf("-1\n"); 28 }
本文介绍了一种使用动态规划解决背包问题的方法,通过二维数组f[i][j]记录1~i物品中是否可以达到价值j的状态,核心迭代公式为f[i][j]=f[i-1][j+a[i]]||f[i-1][j-a[i]],适用于物品数量和背包容量有限的情况。
392

被折叠的 条评论
为什么被折叠?



