hdu2844 多重背包+二进制优化

来源:互联网 发布:spss软件的作用 编辑:程序博客网 时间:2024/05/18 16:18

直接用多重背包,超时

#include<iostream>#include<algorithm>#define INF 1000using namespace std;int main(){int n,m;while (cin >> n >> m, m,n){int *c= new int[n];int *w= new int[n];int *num = new int[n];for (int i = 0; i < n; i++)cin >> c[i], w[i] = c[i];for (int i = 0; i < n; i++)cin >> num[i];int sum = 0;for (int i = 0; i < n; i++)sum += c[i] * num[i];int *dp = new int[m+1];//多开一个单位长度for (int i = 0; i <= m; i++)dp[i] = -INF;dp[0] = 0;for (int i = 0; i <n; i++)for (int k = 1; k <=num[i]; k++)for (int j = m; j >= c[i]; j--)dp[j] = max(dp[j], dp[j - w[i]] + c[i] );int cnt = 0;for (int i = 1; i <=m; i++)if (dp[i] == i)cnt++;cout << cnt << endl;}system("pause");}

进行二进制优化

#include<iostream>#include<algorithm>#define MAX 1000000using namespace std;int c[MAX], w[MAX],num[MAX];int dp[MAX];int main(){int n, m;while (cin >> n >> m, m + n){for (int i = 0; i < n; i++)cin >> c[i], w[i] = c[i];for (int i = 0; i < n; i++)cin >> num[i];for (int i = 0; i <= m; i++)dp[i] = 0;for (int i = 0; i < n; i++){for (int k = 1; k <= num[i]; k = 2 * k){num[i] -= k;for (int j = m; j >= w[i] * k; j--)dp[j] = max(dp[j], dp[j - k*w[i]] + k*c[i]);}if (num[i]){for (int j = m; j >= w[i] * num[i]; j--)dp[j] = max(dp[j], dp[j - w[i] * num[i]] + c[i] * num[i]);}}int cnt = 0;for (int i = 1; i <= m; i++)if (dp[i] == i)cnt++;cout << cnt << endl;}}


0 0
原创粉丝点击