SOJ-2111(小强请吃饭)(0-1背包问题,动态规划)

  

0-1背包问题

1.最优子结构性质(用剪贴思想证明)

y1,y2,… yn如果是一个最优解,因若不然,z2,z3,…zn是上述子问题的最优解,从而y1,z2,z3,…zn是0-1背包问题的最优解,这与y1,y2,… yn是最优解矛盾

2.递归关系

m(i,j)=max{m[i+1][j],m(i+1,j-wi)+vi} j>=wi

m[i][j]=m[i+1][j] 0<=j<wi

 

m[n][j]=vn j>=wn

m[n][j]=0 0<=j<wn

算法代码如下,m[1][c]就是最优解

【回溯得到最优解】:如果m[1][c]=m[2][c],则x1=0,否则x1=1.

当x1=0时,m[2][c]继续构造最优解,当x1=1时,m[2][c-wi]继续构造最优解

#define N 10000 + 1
template<class type>
type knapsack(int n, type c, type v[N], type w[N], type m[N][N], int x[N])
{
    int jmax = MY_MIN(w[n] - 1, c);
    int i, j;
    for (j = 0; j <= jmax; ++j) m[n][j] = 0;
    for (j = w[n]; j <= c; ++j) m[n][j] = v[n];
    for (i = n - 1; i > 1; --i) {
        jmax = MY_MIN(w[i] - 1, c);
        for (j = 0; j <= jmax; ++j) m[i][j] = m[i + 1][j];
        for (j = w[i]; j <= c; ++j) m[i][j] = MY_MAX(m[i + 1][j], m[i + 1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值