NCST--HBCPC2021选拔赛D

Dig Treasure

来源:http://acm.ncst.edu.cn/problem.php?cid=1001&pid=3
标签:【dp】【01背包】【完全背包】

题目简述

据说,学校城堡附近的禁林里藏着无数宝藏。 如果食死徒得到他们,他们可能会用它们来蛊惑人们的心。 因此,尽早找到它们非常重要。需要指出的是,由于某些物品附魔了,所以它们的数量是无限的,而其余的则不是.Ash希望将它们全部挖掘出来,但由于背包的空间有限,他只能装载一些物品。 请帮帮他。

Input
第一行中将有2个整数𝑁,𝑉(0≤𝑁≤104,0≤𝑉≤2*102),表示不同物品的数量和Ash的背包空间。接下来的N行每一行包含3个整数𝑣i,𝑤i,𝑡i(0≤𝑣i,𝑤i≤100),分别表示空间花费,价值和类型(1表示无限,0表示有限)

Output
输出Ash可以得到的宝藏的最大价值。

Sample Input

3 10
1 5 0
2 5 1
1 1 1

Sample Output

26

题目思路

ti为0就使用01背包的状态转移方程;
ti为1就使用完全背包的状态转移方程。

代码(附注释)

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int t,n,m;
int dp[205];

struct N
{
    int v,w,t;
}a[10005];

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>m;
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++){
        cin>>a[i].v>>a[i].w>>a[i].t;
    }

    for(int i=1;i<=n;i++){
        if(a[i].t==0){ //有限个,01背包
            for(int j=m;j>=a[i].v;j--)
                dp[j]=max(dp[j],dp[j-a[i].v]+a[i].w);
        }
        else {//无限个,完全背包
            for(int j=0;j<=m;j++)
                if(j>=a[i].v) dp[j]=max(dp[j],dp[j-a[i].v]+a[i].w);
        }
    } 
       
   cout<<dp[m]<<endl;
   return 0;
}
posted @ 2021-05-24 09:40  unravel_CAT  阅读(115)  评论(0编辑  收藏  举报