题:图不重要,看字
就是某人有体积为v的袋子,要捡骨头,给出n块骨头的价值与体积,问最多拿到多少价值的骨头---恶趣味
01背包模型
先给出二维的吧,二维时/空间都不能压缩
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long #define inf 0x3f3f3f3f #define mes(a, b) memset(a, b, sizeof(a)) #define maxn 1010 using namespace std; int ans, m, n, v; int val[maxn], vol[maxn], dp[maxn][maxn]; int main(){ int t; scanf("%d", &t); while(t--){ mes(val, 0); mes(vol, 0); mes(dp, 0); scanf("%d%d", &n, &v); for(int i = 1; i <= n; i++){ scanf("%d", &val[i]); } for(int i = 1; i <= n; i++){ scanf("%d", &vol[i]); } for(int i = 1; i <= n; i++){ for(int j = 0; j <= v; j++){ if(j >= vol[i]){ dp[i][j] = max(dp[i-1][j], dp[i-1][j-vol[i]]+val[i]); } else{ dp[i][j] = dp[i-1][j]; } } } printf("%d\n", dp[n][v]); } return 0; } 一维的,略微压缩时间与空间 #include<cstdio> #include<cstring> #include<algorithm> #define ll long long #define inf 0x3f3f3f3f #define mes(a, b) memset(a, b, sizeof(a)) #define maxn 1010 using namespace std; int ans, m, n, v; int val[maxn], vol[maxn], dp[maxn]; int main(){ int t; scanf("%d", &t); while(t--){ mes(val, 0); mes(vol, 0); mes(dp, 0); scanf("%d%d", &n, &v); for(int i = 1; i <= n; i++){ scanf("%d", &val[i]); } for(int i = 1; i <= n; i++){ scanf("%d", &vol[i]); } for(int i = 1; i <= n; i++){ for(int j = v; j >= 0; j--){ if(j >= vol[i]){ dp[j] = max(dp[j], dp[j-vol[i]]+val[i]); continue; } break; } } printf("%d\n", dp[v]); } return 0; }