• DP——背包问题(二)


    01背包大家一定都会……

    但如果01背包的W很大怎么办……

    此时我们观察,若v[i]很小,我们可以考虑建立有关v[i]的方程

    方程内容大概是:在达到某一v时,所需的总w最小

    说多了不如上代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<string>
     6 #include<algorithm>
     7 using namespace std;
     8 int n,m,sumv,ans;
     9 int dp[300][234000],w[500],v[500],wi,vi;
    10 int a[300];
    11 int main(){
    12     scanf("%d %d",&n,&m);
    13     for(int i=1;i<=n;i++) scanf("%d %d",&w[i],&v[i]);
    14     for(int i=1;i<=n;i++) sumv+=v[i];
    15     for(int j=0;j<=sumv;j++) dp[0][j]=200000000;
    16     for(int i=1;i<=n;i++)
    17     for(int j=sumv;j>=1;j--){
    18         wi=w[i];
    19         vi=v[i];
    20         if(j<=v[i]) dp[i][j]=min(dp[i-1][j],w[i]);
    21         else{
    22             dp[i][j]=dp[i-1][j];
    23             dp[i][j]=min(dp[i][j],dp[i-1][j-v[i]]+w[i]);
    24         }
    25     }
    26     for(int i=1;i<=sumv;i++) if(dp[n][i]<=m) ans=i;
    27     printf("%d
    ",ans);
    28     return 0;
    29 }
  • 相关阅读:
    http服务读取配置文件,交叉编译
    etcd增删改查
    初始
    20141017--类型String类
    20141017--异常语句try-catch
    20141017--循环语句whlie,do
    20141017--循环语句for 穷举
    20141016--for 菱形
    20141016--for 兔子
    20141015--for语句1
  • 原文地址:https://www.cnblogs.com/Misaki-Mei/p/7407104.html
Copyright © 2020-2023  润新知