hdoj2191多重背包化为01背包

来源:互联网 发布:淘宝3c认证必须要吗 编辑:程序博客网 时间:2024/06/07 09:49

不化为01背包情况

#include <iostream>#include <algorithm>#include <stdio.h>#include <string.h>using namespace std;static int dp[105][105];//前i种物品价格为j的时候总重量static int p[105],h[105],c[105];int main(){int C;scanf("%d",&C);while(C--){int n,m;scanf("%d %d",&n,&m);for (int i=1;i<=m;++i) scanf("%d %d %d",&p[i],&h[i],&c[i]);memset(dp,0,sizeof(dp));int ans = 0;for (int i=1;i<=m;++i){for (int j=0;j<=n;++j){for (int k=0;k<=c[i];++k){if (j>=k*p[i]){dp[i][j] = max(dp[i-1][j-k*p[i]]+k*h[i],dp[i][j]);}}ans = max(ans,dp[i][j]);}}printf("%d\n",ans);}return 0;}


化为01背包:

//化为01背包#include <iostream>#include <algorithm>#include <stdio.h>#include <string.h>using namespace std;static int dp[2010];//前i种物品价格为j的时候总重量static int p[2010],h[2010];int main(){int C;scanf("%d",&C);while(C--){int n,m;int cs = 0;scanf("%d %d",&n,&m);int c;int p1,h1;for (int i=1;i<=m;++i){ scanf("%d %d %d",&p1,&h1,&c); for (int j=1;j<=c;++j) { p[cs+j] = p1;h[cs+j] = h1; } cs+=c;}memset(dp,0,sizeof(dp));int ans = 0;for (int i=1;i<=cs;++i){for (int j=n;j>=p[i];--j){dp[j] = max(dp[j],dp[j-p[i]]+h[i]);ans = max(ans,dp[j]);}}printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击