AC_2. 01背包问题
代码:
#include<iostream> #include<string.h> #include<algorithm> using namespace std; int N, V;//定义数据组数和背包容量 const int NUM = 1005; int v[NUM], w[NUM]; int dp[NUM][NUM];//定义数组保存记录 int main() { cin >> N >> V; memset(dp, 0, sizeof dp); for (int i = 1; i<=N; i++) { cin >> v[i] >> w[i]; } for (int i = 1; i<=N; i++)//因为要计算上一个,所以从1开始计数 { for (int j = V; j>0; j--) { if (j>=v[i]) { dp[i][j] = max(dp[i - 1][j], dp[i-1][j - v[i]]+ w[i]);//装进来 } else { dp[i][j] = dp[i-1][j];//不装 } } } cout << dp[N][V] << endl; return 0; }
改进
#include<iostream> #include<string.h> #include<algorithm> using namespace std; int N, V;//定义数据组数和背包容量 const int NUM = 1005; int v[NUM], w[NUM]; int dp[NUM];//定义数组保存记录 int main() { cin >> N >> V; memset(dp, 0, sizeof dp); for (int i = 1; i<=N; i++) { cin >> v[i] >> w[i]; } for (int i = 1; i<=N; i++)//因为要计算上一个,所以从1开始计数 { for (int j = V; j>=1; j--) { if (dp[j]<= dp[j-v[i]]+w[i]&&j-v[i]>=0) { dp[j] = dp[j - v[i]]+ w[i];//装进来 } } } cout << dp[V] << endl; return 0; }
以大多数人努力程度之低,根本轮不到去拼天赋~