• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ACM s1124yy
守りたいものが 強くさせること
博客园    首页    新随笔    联系   管理     

HDU 3033 分组背包(至少选一个)

分组背包(至少选一个)

我真的搞不懂为什么,所以现在就只能当作是模板来用吧 如果有大牛看见 希望评论告诉我

&代码:

#include <cstdio>
#include <bitset>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;

#define N 10005
int dp[102][N], s[102], v[102], w[102];

int main() {
	int n, m, k, S, i, j;
	while(scanf("%d%d%d", &n, &m, &S) != EOF) {
		for(i = 0; i < n; i++)
			scanf("%d%d%d", &s[i], &v[i], &w[i]);
		for(i = 0; i <= S; i++)
			for(j = 0; j <= m; j++) {
				if(i == 0)
					dp[i][j] = 0;
				else
					dp[i][j] = -1;
			}
		for(i = 1; i <= S; i++)
			for(j = 0; j < n; j++)
				if(s[j] == i) //第i款
					for(k = m; k >= v[j]; k--) {
						//下面2行的顺序绝对不能变, 如果交换了 就会wa 不知道为什么
						dp[i][k] = max(dp[i][k], dp[i][k - v[j]] + w[j]);
						dp[i][k] = max(dp[i][k],  dp[i - 1][k - v[j]] + w[j]);
					}
		if(dp[S][m] < 0)
			printf("Impossible\n");
		else
			printf("%d\n", dp[S][m]);
	}
	return 0;
}
posted @ 2017-05-13 20:31  s1124yy  阅读(188)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3