装箱问题 动态规划 java_【动态规划】装箱问题

思路

这道题乍看有点难度,但其实就是个容量等于价格的背包问题QAQ。

关于背包问题,详见我的另一篇博文:【洛谷】采药

此题只要把上一题的代码稍作做些修改即可~

设dp[i][j]为前i个物体装入容量为j的背包的最大价值,w[i],v[i]分别为第i个物品的重量和价格。

状态转移方程为:

dp[i][j]=dp[i-1][j] (j

dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+v[i]} (j≥w[i])

水代码开始~(逃~~~)

Code

//经典背包,无需解释

#include

#include

#include

using namespace std;

int T,M,w[31],v[31],dp[31][20001];

int main()

{

//初始化

for(int i=1;i<=M;i++)

{

dp[i][0]=0;

}

for(int i=1;i<=T;i++)

{

dp[0][i]=0;

}

//读入

scanf("%d%d",&T,&M);

for(int i=1;i<=M;i++)

{

scanf("%d",&w[i]);

v[i]=w[i];

}

//装叉走起

for(int i=1;i<=M;i++)

{

for(int j=1;j<=T;j++)

{

if(j

{

dp[i][j]=dp[i-1][j];

}

else

{

dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);

}

}

}

//输出

printf("%d",T-dp[M][T]);

return 0;

}

此外还可以把空间压为一维。

Code2.0

//经典背包,无需解释

#include

#include

#include

using namespace std;

int T,M,w[31],v[31],dp[20001];

int main()

{

for(int i=1;i<=T;i++)

{

dp[i]=0;

}

scanf("%d%d",&T,&M);

for(int i=1;i<=M;i++)

{

scanf("%d",&w[i]);

v[i]=w[i];

}

for(int i=1;i<=M;i++)

{

for(int j=T;j>=1;j--)

{

if(j>=w[i])

dp[j]=max(dp[j],dp[j-w[i]]+v[i]);

}

}

printf("%d",T-dp[T]);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值