Orz dp
一道不是很难的dp,分组背包。
给你k个球鞋的牌子,每种又包含一些不同种类的球鞋,要求每种牌子的球鞋都要包含,给出每种球鞋的price和value,以及又多少钱,问你value最大可以是多少。
就按照牌子分开来进行dp,具体看代码
#include<bits/stdc++.h>
using namespace std;
#define clr(a,b) memset(a,b,sizeof(a))
#define pb(a) push_back(a)
#define fir first
#define se second
#define LL long long
typedef pair<int,int> pii;
const double eps = 0.0000001;
const int inf = 1e9+7;
const LL mod = 9973;
const int maxn = 1e9+5;
vector<pii> kind[25];
int dp[25][10005]; //这里要用二维的dp,分别表示当前的种类和最大的value
int main() {
int n,kk,m;
while(scanf("%d%d%d",&n,&m,&kk) != EOF) {
clr(dp,-1);
for(int i = 0;i <= m;i++) dp[0][i] = 0;
for(int i = 0;i <= kk;i++) kind[i].clear(); //kind的链接表来存每个牌子的球鞋
for(int i = 1;i <= n;i++) {
int t; pii tmp;
scanf("%d%d%d",&t,&tmp.fir,&tmp.se);
kind[t].pb(tmp);
}
for(int i = 1;i <= kk;i++) {
for(int j = 0;j < kind[i].size();j++) {
for(int k = m;k >= kind[i][j].fir;k--) {
if(dp[i][k - kind[i][j].fir] != -1) //如果当前种类已经选过了,那就再往下选最大的
dp[i][k] = max(dp[i][k],dp[i][k-kind[i][j].fir]+kind[i][j].se);
if(dp[i-1][k - kind[i][j].fir] != -1) //如果没选过,那么就优先把这个种类的加进来
dp[i][k] = max(dp[i][k],dp[i-1][k-kind[i][j].fir]+kind[i][j].se);
}
}
}
if(dp[kk][m] == -1) printf("Impossible\n"); //如果不可能都选,就输出imposible
else printf("%d\n",dp[kk][m]);
}
}
还需要更勤奋,最近都没尽全力的学习。
还有就是要把acm当作兴趣吧,本来就是一个很有意思的东西,不要去抵触它~~
机会还是很多,同志还需努力~
加油。