题目大意:
一个商场打促销,所有的东西都有价格和重量,你打算趁着促销的时候带着一家老小来抢购。每个人拿东西规定一样只能拿一个,问你最后全家总共拿了的物品的价值。
思路见代码下方:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
using namespace std;
int dp[30001];
int price[1001],weight[1001],group[101];
int max(int x,int y)
{
if(x>y)
return x;
return y;
}
int main()
{
ios::sync_with_stdio(false);
int t,n,i,j,g,tot,k;
cin>>t;
while(t--)
{
tot=0;
cin>>n;
for(i=1;i<=n;i++)
cin>>price[i]>>weight[i];
cin>>g;
for(i=1;i<=g;i++)
cin>>group[i];
for(k=1;k<=g;k++)
{
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
for(j=group[k];j>=weight[i];j--)
dp[j]=max(dp[j],dp[j-weight[i]]+price[i]);
}
tot+=dp[group[k]];
}
cout<<tot<<endl;
}
return 0;
}
思路
最开始理解这道题以为全家拿的东西都不能重复,结果发现样例算的不对。后来发现是每个人拿的东西不能重复而已。对每个进行01背包即可。(现在其实可以想象如果每个人拿的东西都不能一样该咋做?)[^footnote].