这次一定要记住 多重背包

  • 马上就要校赛了,也不能太水了吧,把学过的再自己打一边
  • 这次一个字的书也不看 - -!
    C - Cash Machine POJ - 1276
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[100009],c[100009],w[100009],m[100009];
int n,M,t;
void solve(int cost,int weight,int nn){
    if(nn*cost>=M){
        for(int i=cost;i<=M;i++){
            dp[i]=max(dp[i-cost]+weight,dp[i]);
        }
        return;
    }
    int k=1;
    while(k<nn){
        for(int i=M;i>=k*cost;i--){
            dp[i]=max(dp[i-k*cost]+k*weight,dp[i]);
        }
        nn-=k;
        k*=2;
    }

    for(int i=M;i>=nn*cost;i--){
        dp[i]=max(dp[i-nn*cost]+nn*weight,dp[i]);
    }
}
int main()
{
    while(~scanf("%d%d",&M,&n))
    {
        for(int i=1;i<=n;i++){scanf("%d%d",&m[i],&c[i]);w[i]=c[i];}
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            solve(c[i],w[i],m[i]);
        }
        printf("%d\n",dp[M]);
    }
    return 0;
}
  • 看了qty的题解,转化成0-1真是tqdl
  • http://qinruifeng.pro/category/acm-题解篇/2018-春季学期-第二周-基础dp/

  • 第二天续,怎么理解qty深邃的思想啊 - -

  • 百度搜索:完全背包模版题。。。
  • poj1276 和 hdu2844
  • 多重背包的模板题,多重背包问题是:
    有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
  • 这两道题没有给重量(就是一个题啊), 也就是v[i] = w[i];
  • 第一种解法
  • 判断不同情况而使用0-1或者完全背包的模版(也就是上面的,但是太乱了,应该把函数分开的)

*第二种解法,用二进制转换成0-1背包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值