zoukankan      html  css  js  c++  java
  • hdu 4501(背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4501

    思路:dp[l][i][j][p]表示选前l件时花费i元,积分j,免费p时最大价值

    View Code
     1 #include<iostream>
     2 #include<cstring>
     3 #include<algorithm>
     4 const int N=104;
     5 using namespace std;
     6 
     7 struct Node{
     8     int price;
     9     int score;
    10     int value;
    11 }node[N];
    12 int dp[N][N][N][6];//表示选前l件时花费i元,积分j,免费p时最大价值//
    13 
    14 
    15 int main(){
    16     int n,v1,v2,k;
    17     while(~scanf("%d%d%d%d",&n,&v1,&v2,&k)){
    18         int ans=0;
    19         for(int i=1;i<=n;i++){
    20             scanf("%d%d%d",&node[i].price,&node[i].score,&node[i].value);
    21         }
    22         memset(dp,0,sizeof(dp));
    23         for(int l=1;l<=n;l++){
    24             for(int i=0;i<=v1;i++){
    25                 for(int j=0;j<=v2;j++){
    26                     for(int p=0;p<=k;p++){
    27                         dp[l][i][j][p]=dp[l-1][i][j][p];
    28                         if(i-node[l].price>=0){
    29                             dp[l][i][j][p]=max(dp[l][i][j][p],dp[l-1][i-node[l].price][j][p]+node[l].value);
    30                         }
    31                         if(j-node[l].score>=0){
    32                             dp[l][i][j][p]=max(dp[l][i][j][p],dp[l-1][i][j-node[l].score][p]+node[l].value);
    33                         }
    34                         if(p>0)dp[l][i][j][p]=max(dp[l][i][j][p],dp[l-1][i][j][p-1]+node[l].value);
    35                         ans=max(ans,dp[l][i][j][p]);
    36                     }
    37                 }
    38             }
    39         }
    40         printf("%d\n",ans);
    41     }
    42     return 0;
    43 }
  • 相关阅读:
    裴蜀定理
    上下界网络流
    寻找符合子序列要求的区间个数
    小猪分配 , 最大流
    floyd + 最大流 (奶牛分配问题)
    抛硬币问题
    消消乐
    Entity Framework(1)
    冒泡排序
    二分法查找数据
  • 原文地址:https://www.cnblogs.com/wally/p/2974440.html
Copyright © 2011-2022 走看看