HDU 1712
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int dp[maxn],n,m,a[110][110];
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin >> a[i][j];
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=m;j>=0;j--)
{
for(int k=1;k<=m;k++)
{
if(j>=k)
dp[j]=max(dp[j],dp[j-k]+a[i][k]);
}
}
}
cout << dp[m] << endl;
}
return 0;
}
HDU 3535
有三种策略的分组背包,s=0是至少取一件,s=1是至多取一件,s=2则是任意取,变为01背包
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define PI acos(-1.0)
typedef long long ll;
const int maxn=1e6+10;
int dp[110][110],n,t,m,s;
struct node
{
int w[110],v[110],ss,num;
}e[110];
int main()
{
while(scanf("%d%d",&n,&t)!=EOF)
{
memset(dp,-1,sizeof(dp));
memset(dp[0],0,sizeof(dp[0]));
for(int i=1;i<=n;i++)
{
cin >> m >> s;
e[i].ss=s;
e[i].num=m;
for(int j=1;j<=m;j++)
cin >> e[i].w[j] >> e[i].v[j];
}
for(int i=1;i<=n;i++)
{
if(e[i].ss==0)
{
for(int j=1;j<=e[i].num;j++)
{
for(int k=t;k>=e[i].w[j];k--)
{
if(dp[i][k-e[i].w[j]]!=-1)
dp[i][k]=max(dp[i][k],dp[i][k-e[i].w[j]]+e[i].v[j]);
if(dp[i-1][k-e[i].w[j]]!=-1)
dp[i][k]=max(dp[i][k],dp[i-1][k-e[i].w[j]]+e[i].v[j]);
}
}
}
else if(e[i].ss==1)
{
for(int j=0;j<=t;j++)
dp[i][j]=dp[i-1][j];
for(int j=1;j<=e[i].num;j++)
{
for(int k=t;k>=e[i].w[j];k--)
if(dp[i-1][k-e[i].w[j]]!=-1)
dp[i][k]=max(dp[i][k],dp[i-1][k-e[i].w[j]]+e[i].v[j]);
}
}
else
{
for(int j=0;j<=t;j++)
dp[i][j]=dp[i-1][j];
for(int j=1;j<=e[i].num;j++)
for(int k=t;k>=e[i].w[j];k--)
if(dp[i][k-e[i].w[j]]!=-1)
dp[i][k]=max(dp[i][k],dp[i][k-e[i].w[j]]+e[i].v[j]);
}
}
cout << dp[n][t] << endl;
}
return 0;
}
HDU 3810
有n个地方形成x个无向图,每个无向图内的顶点可以不花费时间互相移动,每个顶点有一定价值的怪物,求取得m价值的最少时间。价值范围1e9,数据太大,需要用优先队列进行优化,将时间多价值少的去掉。
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define PI acos(-1.0)
typedef long long ll;
const int maxn=110;
struct node
{
int time,money;
}a[maxn];
struct no
{
int time,money;
friend bool operator < (const no &x,const no &y)
{
if(x.money!=y.money)
return x.money<y.money;
else
return x.time>y.time;
}
};
int vis[maxn],m,n,k,mp[maxn][maxn],cnt,minn;
vector<node> g[maxn];
void dfs(int u)
{
vis[u]=1;
g[cnt].push_back(a[u]);
for(int i=1;i<=n;i++)
{
if(!vis[i]&&mp[u][i])
dfs(i);
}
}
void d()
{
memset(vis,0,sizeof(vis));
cnt=0;
for(int i=0;i<maxn;i++)
g[i].clear();
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
dfs(i);
cnt++;
}
}
}
void solve()
{
priority_queue<no> q1,q2;
no b;
for(int i=0;i<cnt;i++)
{
while(!q1.empty())
q1.pop();
while(!q2.empty())
q2.pop();
b.time=0;
b.money=0;
q1.push(b);
for(int j=0;j<g[i].size();j++)
{
while(!q1.empty())
{
b=q1.top();
q1.pop();
q2.push(b);
b.time+=g[i][j].time;
b.money+=g[i][j].money;
if(b.money>=m)
{
minn=min(minn,b.time);
continue;
}
if(b.time>minn)
continue;
q2.push(b);
}
int minm=inf;
while(!q2.empty())
{
b=q2.top();
q2.pop();
if(b.time<minm)
{
q1.push(b);
minm=b.time;
}
}
}
}
}
int main()
{
int t;
cin >> t;
int ans=1;
while(t--)
{
cin >> n >> m;
memset(mp,0,sizeof(mp));
for(int i=1;i<=n;i++)
{
cin >> a[i].time >> a[i].money >> k;
for(int j=0;j<k;j++)
{
int x;
cin >> x;
mp[i][x]=mp[x][i]=1;
}
}
minn=inf;
d();
solve();
printf("Case %d: ",ans++);
if(minn==inf)
printf("Poor Magina, you can't save the world all the time!\n");
else
printf("%d\n",minn);
}
return 0;
}