D - Knapsack 1
Time Limit: 2 sec / Memory Limit: 1024 MB
Score : <var>100100</var> points
Problem Statement
There are <var>NN</var> items, numbered <var>1,2,…,N1,2,…,N</var>. For each <var>ii</var> (<var>1≤i≤N1≤i≤N</var>), Item <var>ii</var> has a weight of <var>wiwi</var> and a value of <var>vivi</var>.
Taro has decided to choose some of the <var>NN</var> items and carry them home in a knapsack. The capacity of the knapsack is <var>WW</var>, which means that the sum of the weights of items taken must be at most <var>WW</var>.
Find the maximum possible sum of the values of items that Taro takes home.
Constraints
- All values in input are integers.
- <var>1≤N≤1001≤N≤100</var>
- <var>1≤W≤1051≤W≤105</var>
- <var>1≤wi≤W1≤wi≤W</var>
- <var>1≤vi≤1091≤vi≤109</var>
Input
Input is given from Standard Input in the following format:
<var>NN</var> <var>WW</var> <var>w1w1</var> <var>v1v1</var> <var>w2w2</var> <var>v2v2</var> <var>::</var> <var>wNwN</var> <var>vNvN</var>
Output
Print the maximum possible sum of the values of items that Taro takes home.
Sample Input 1 Copy
3 8 3 30 4 50 5 60
Sample Output 1 Copy
90
Items <var>11</var> and <var>33</var> should be taken. Then, the sum of the weights is <var>3+5=83+5=8</var>, and the sum of the values is <var>30+60=9030+60=90</var>.
Sample Input 2 Copy
5 5 1 1000000000 1 1000000000 1 1000000000 1 1000000000 1 1000000000
Sample Output 2 Copy
5000000000
The answer may not fit into a 32-bit integer type.
Sample Input 3 Copy
6 15 6 5 5 6 6 4 6 6 3 5 7 2
Sample Output 3 Copy
17
Items <var>2,42,4</var> and <var>55</var> should be taken. Then, the sum of the weights is <var>5+6+3=145+6+3=14</var>, and the sum of the values is <var>6+6+5=176+6+5=17</var>.
题目链接:https://atcoder.jp/contests/dp/tasks/dp_d
题意:有N个团队,每一个团队有w[i]个人,并且有v[i]的贡献值。
现在你有一个W的容量的公司,你需要从这n个团队中挑选出几个(每一个团队只能挑选一次),使之团队人数的总和小于W,并且贡献值的总和尽可能的大。
思路:裸的普通的背包问题。
我的AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <vector> #define rep(i,x,n) for(int i=x;i<n;i++) #define repd(i,x,n) for(int i=x;i<=n;i++) #define pii pair<int,int> #define pll pair<long long ,long long> #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define MS0(X) memset((X), 0, sizeof((X))) #define MSC0(X) memset((X), '\0', sizeof((X))) #define pb push_back #define mp make_pair #define fi first #define se second #define gg(x) getInt(&x) using namespace std; typedef long long ll; inline void getInt(int* p); const int maxn=1000010; const int inf=0x3f3f3f3f; /*** TEMPLATE CODE * * STARTS HERE ***/ int n,m; int w[maxn]; ll v[maxn]; ll dp[maxn]; int main() { gbtb; cin>>n>>m; repd(i,1,n) { cin>>w[i]>>v[i]; } repd(i,1,n) { for(int j=m;j>=w[i];j--) { dp[j]=max(dp[j],1ll*dp[j-w[i]]+v[i]); } } cout<<dp[m]; return 0; } inline void getInt(int* p) { char ch; do { ch = getchar(); } while (ch == ' ' || ch == '\n'); if (ch == '-') { *p = -(getchar() - '0'); while ((ch = getchar()) >= '0' && ch <= '9') { *p = *p * 10 - ch + '0'; } } else { *p = ch - '0'; while ((ch = getchar()) >= '0' && ch <= '9') { *p = *p * 10 + ch - '0'; } } }