本文主要是介绍uva 10130 超级甩卖 SuperSale,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目大意:
一个商场打促销,所有的东西都有价格和重量,你打算趁着促销的时候带着一家老小来抢购。每个人拿东西规定一样只能拿一个,问你最后全家总共拿了的物品的价值。
思路见代码下方:
#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].
这篇关于uva 10130 超级甩卖 SuperSale的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!