返回信息流求大神帮做BUPT OJ 980. Zhuang Yi's Sister
链接地址:http://10.105.242.83/problem/980/
我的WA答案:
import java.util.Scanner;
class E{
int w;
int v;
int p;
}
public class Main {
static int V1;
static int V2;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int caseCout = 1;
while(scanner.hasNext())
{
System.out.print("Case "+caseCout+": ");
caseCout++;
V1 = scanner.nextInt();
V2 = scanner.nextInt();
int n = scanner.nextInt();
E[] listE = new E[n+1];
int []mark = new int[n+1];
for(int i=1;i<=n;i++)
{
mark[i] = 0;
}
int Ecount = 1;
int T = n;
while(T-- > 0)
{
int w = scanner.nextInt();
int v = scanner.nextInt();
int p = scanner.nextInt();
E newE = new E();
newE.w = w;
newE.v = v;
newE.p = p;
listE[Ecount++] = newE;
}
int [][]dp1 = new int[n+1][V1+1];
int [][]dp2 = new int[n+1][V2+1];
for(int i=0;i<=V1;i++)
{
dp1[0][i] = 0;
}
for(int i=0;i<=V2;i++)
{
dp2[0][i] = 0;
}
for(int i=1;i<=n;i++)
{
for(int j=V1;j>=listE[i].w;j--)
{
if(dp1[i-1][j-listE[i].w]+listE[i].v > dp1[i-1][j])
{
mark[i] = 1;
dp1[i][j] = dp1[i-1][j-listE[i].w]+listE[i].v;
//System.out.println("物品i加入到bag1中"+i);
}
else{
dp1[i][j] = dp1[i-1][j];
}
}
if(V1 >= listE[i].w)
for(int j=listE[i].w-1;j>=0;j--)
{
//System.out.println( i + " "+j);
dp1[i][j] = dp1[i-1][j];
}
for(int j=V2;j>=listE[i].w;j--)
{
if(mark[i] == 0)
{
if(dp2[i-1][j-listE[i].w]+listE[i].v > dp2[i-1][j])
{
mark[i] = 1;
dp2[i][j] = dp2[i-1][j-listE[i].w]+listE[i].v;
//System.out.println("物品i加入到bag2中"+i);
}
else{
dp2[i][j] = dp2[i-1][j];
}
}
}
if(V2 >= listE[i].w)
for(int j=listE[i].w-1;j>=0;j--)
{
dp2[i][j] = dp2[i-1][j];
}
}
int eatMax = 0;
int eatLoc = 0;
boolean flag = false;
int result = 0;
for(int i=1;i<=n;i++)
{
//System.out.println(i+"-->"+mark[i]);
if(mark[i] == 0 && listE[i].v > eatMax)
{
eatMax = listE[i].v;
eatLoc = i;
}
if(listE[i].p == 1&&mark[i] == 0)
{
eatMax = listE[i].v;
eatLoc = i;
}
}
mark[eatLoc] = 1;
for(int i=1;i<=n;i++)
{
//System.out.println(i+"-->"+mark[i]);
if(listE[i].p == 1 && mark[i] == 0)
{
flag = true;
break;
}
if(mark[i] == 1)
result += listE[i].v;
}
if(flag == true)
{
System.out.println(-1);
}
else System.out.println(result);
System.out.println();
}
}
}
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #95041同步于 2018/3/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
求大神帮做BUPT OJ 980. Zhuang Yi's Sister
TianYing
2018/3/13镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
在校外上不了内网看不到题面,不过应该没什么变化,下次发帖可以考虑把题面放上来或者简单解释一下。
给一个大致想法吧
01背包变式:两个背包 + 有些必买物品 + 一次免费券
dp[j][k][i]表示第一个背包装了j且第二个背包装了k且用了(1-i)张免费券后能得到的最大的开心值
先算把特殊物品取了 在这个过程中得到三维dp数组的所有合法状态【如果特殊物品没取完 那么结果是dp数组的所有位置均为-1】
然后再根据合法状态去取正常的物品
算两个背包和枚举免费的物品这三个过程一定不能分开
否则不能保证每件物品只取一次
发自「贵邮」
谢谢您,有没有网址看源码解析啊,我比较蠢,还是不懂
【 在 susliks (susliks) 的大作中提到: 】
: 在校外上不了内网看不到题面,不过应该没什么变化,下次发帖可以考虑把题面放上来或者简单解释一下。
: 给一个大致想法吧
: 01背包变式:两个背包 + 有些必买物品 + 一次免费券
: ...................
通过『我邮2.0』发布
你是要准备研究生复试吧,或许可以另做一些简单一点的。我当时出这个题的时候定位是校赛预选赛的中高档难度,你确定要跟这个题死磕吗?
【 在 TianYing 的大作中提到: 】
: 谢谢您,有没有网址看源码解析啊,我比较蠢,还是不懂
: 【 在 susliks (susliks) 的大作中提到: 】
: : 在校外上不了内网看不到题面,不过应该没什么变化,下次发帖可以考虑把题面
: .........
发自「贵邮」