Accepted Necklace
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4658 Accepted Submission(s): 1853
Input The first line of input is the number of cases.
For each case, the first line contains two integers N (N <= 20), the total number of stones, and K (K <= N), the exact number of stones to make a necklace.
Then N lines follow, each containing two integers: a (a<=1000), representing the value of each precious stone, and b (b<=1000), its weight.
The last line of each case contains an integer W, the maximum weight my mother will accept, W <= 1000.
Output For each case, output the highest possible value of the necklace.
Sample Input 1 2 1 1 1 1 1 3
Sample Output 1 思路:01背包,另外要开二维数组分别记录当前重量和数量(有数量限制)。
#include<bits/stdc++.h> #include<queue> #include<cstdio> #include<iostream> #define REP(i, a, b) for(int i = (a); i <= (b); ++ i) #define REP(j, a, b) for(int j = (a); j <= (b); ++ j) #define PER(i, a, b) for(int i = (a); i >= (b); -- i) using namespace std; template <class T> inline void rd(T &ret){ char c; ret = 0; while ((c = getchar()) < '0' || c > '9'); while (c >= '0' && c <= '9'){ ret = ret * 10 + (c - '0'), c = getchar(); } } int dp[1010][30]; struct node{int val,w;}p[30]; int main() { int T; rd(T); while(T--){ int n,k,mw; rd(n),rd(k); for(int i=1;i<=n;i++)cin>>p[i].val>>p[i].w; cin>>mw; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ for(int j=mw;j>=p[i].w;j--){ for(int h=1;h<=k;h++){ dp[j][h]=max(dp[j][h],dp[j-p[i].w][h-1]+p[i].val); } } } int maxn=-0xfffffff; for(int i=0;i<mw;i++)maxn=max(maxn,dp[i][k]); cout<<maxn<<endl; } return 0; }