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;
}