uva 10130 超级甩卖 SuperSale

来源:互联网 发布:windows 10 rs1 iso 编辑:程序博客网 时间:2024/04/27 19:33

题目大意:

一个商场打促销,所有的东西都有价格和重量,你打算趁着促销的时候带着一家老小来抢购。每个人拿东西规定一样只能拿一个,问你最后全家总共拿了的物品的价值。

思路见代码下方:

#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].


0 0