4種寫法:
揹包0-1 #include <iostream> using namespace std; int w[101] = {0}, c[101] = {0}, dp[101][101] = {0}; int main(){ int n, v; cin >> n >> v; for(int i = 1; i <= n; i++){ cin >> w[i] >> c[i]; } for(int i = 1; i <= n; i++){ for(int j = v; j > 0; j--){ if(w[i] <= j){ dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + c[i]); }else{ dp[i][j] = f[i-1][j]; } } } cout << dp[n][v] << endl; return 0; } ------------------------------------------------------ #include <iostream> using namespace std; int w[101] = {0}, c[101] = {0}, dp[101] = {0}; int main(){ int n, v; cin >> n >> v; for(int i = 1; i <= n; i++){ cin >> w[i] >> c[i]; } for(int i = 1; i <= n; i++){ for(int j = v; j >= w[i]; j--){ if(dp[j-w[i]] + c[i] > dp[j]){ dp[j] = dp[j-w[i]] + c[i]; } } } cout << dp[v] << endl; return 0; } ----------------------------------------------------------------------- 完全揹包問題 #include <iostream> using namespace std; int w[101] = {0}, c[101] = {0}, dp[101][101] = {0}; int main(){ int n, v; cin >> n >> v; for(int i = 1; i <= n; i++){ cin >> w[i] >> c[i]; } for(int i = 1; i <= n; i++){ for(int j = 1; j <= v; j++){ if(w[i] <= j){ dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + c[i]); }else{ dp[i][j] = dp[i-1][j]; } } } cout << dp[n][v] << endl; return 0; } --------------------------------------------------------------- #include <iostream> using namespace std; int w[101] = {0}, c[101] = {0}, dp[101][101] = {0}; int main(){ int n, v; cin >> n >> v; for(int i = 1; i <= n; i++){ cin >> w[i] >> c[i]; } for(int i = 1; i <= n; i++){ for(int j = 1; j <= v; j--){ if(w[i] <= j){ dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + c[i]); }else{ dp[i][j] = dp[i-1][j]; } } } cout << dp[n][v] << endl; return 0; } -------------------------------------------------------------- #include <iostream> using namespace std; int w[101] = {0}, c[101] = {0}, dp[101][101] = {0}; int main(){ int n, v; cin >> n >> v; for(int i = 1; i <= n; i++){ cin >> w[i] >> c[i]; } for(int i = 1; i <= n; i++){ for(int j = 1; j <= v; j--){ if(w[i] <= j){ dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + c[i]); }else{ dp[i][j] = dp[i-1][j]; } } } cout << dp[n][v] << endl; return 0; } 還差一種編譯不過 #include <bits/stdc++.h> using namespace std; int w[101] = {0}, c[101] = {0}, dp[101][101] = {0}; int main(){ int n, v; cin >> n >> v; for(int i = 1; i <= n; i++){ cin >> w[i] >> c[i]; } for(int i = 1; i <= n; i++){ for(int j = w[i]; j <= v; j++){ dp[j] = max(dp[j], dp[j-w[i]] + c[i]); } } cout << dp[v] << endl; return 0; }
揹包問題 DP
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.