vijos1426(状态压缩背包dp)
2016-08-14 15:10
295 查看
并不难想,但也是要练一练写代码的能力
注意一点,这里用o【i】数组记录一个状态是否出现!因为N进制状态压缩,会出现太多太多无用的状态!,显然的会超时
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,v[7],f[5000050];
bool o[5000050];
int S,ans;
bool pan(int *a)
{
for (int i=1;i<=m;i++) if (a[i]>v[i]) return false;
return true;
}
int main()
{
scanf("%d%d",&n,&m);
int mx=0;
for (int i=1;i<=m;i++) scanf("%d",&v[i]),mx=max(mx,v[i]);
mx++;
S=1;
for (int i=1;i<=m;i++) S=S*mx; S--;
o[0]=true;
for (int i=1;i<=n;i++)
{
int up,a[7];
scanf("%d",&up);
for (int i=1;i<=m;i++) scanf("%d",&a[i]);
for (int s=S;s>=0;s--)
if (o[s])
//该优化,还是要优化一下这么显然的东西的,因为多余的状态实在太多了
{
int k=s,b[7];
for (int j=1;j<=m;j++)
{
b[j]=k%mx;
k=k/mx;
}
for (int j=1;j<=m;j++) b[j]+=a[j];
if (pan(b))
{
int k=0;
for (int l=m;l>=1;l--) k=k*mx+b[l];
o[k]=true;
f[k]=max(f[k],f[s]+up);
ans=max(ans,f[k]);
}
}
/***********************************************/
}
printf("%d",ans);
return 0;
}
注意一点,这里用o【i】数组记录一个状态是否出现!因为N进制状态压缩,会出现太多太多无用的状态!,显然的会超时
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,v[7],f[5000050];
bool o[5000050];
int S,ans;
bool pan(int *a)
{
for (int i=1;i<=m;i++) if (a[i]>v[i]) return false;
return true;
}
int main()
{
scanf("%d%d",&n,&m);
int mx=0;
for (int i=1;i<=m;i++) scanf("%d",&v[i]),mx=max(mx,v[i]);
mx++;
S=1;
for (int i=1;i<=m;i++) S=S*mx; S--;
o[0]=true;
for (int i=1;i<=n;i++)
{
int up,a[7];
scanf("%d",&up);
for (int i=1;i<=m;i++) scanf("%d",&a[i]);
for (int s=S;s>=0;s--)
if (o[s])
//该优化,还是要优化一下这么显然的东西的,因为多余的状态实在太多了
{
int k=s,b[7];
for (int j=1;j<=m;j++)
{
b[j]=k%mx;
k=k/mx;
}
for (int j=1;j<=m;j++) b[j]+=a[j];
if (pan(b))
{
int k=0;
for (int l=m;l>=1;l--) k=k*mx+b[l];
o[k]=true;
f[k]=max(f[k],f[s]+up);
ans=max(ans,f[k]);
}
}
/***********************************************/
}
printf("%d",ans);
return 0;
}
相关文章推荐
- vijos1426兴奋剂检查(多维费用的背包问题+状态压缩+hash)
- vijos1426兴奋剂检查(多维费用的背包问题+状态压缩+hash)
- 哈希算法状态压缩dp vijos 1426
- 【bzoj1688】[USACO2005 Open]Disease Manangement 疾病管理 状态压缩dp+背包dp
- light oj 1147 背包dp+状态压缩 好题
- vijos - P1286座位安排 (DP状态压缩 + 组合数 + python)
- poj2923 状态压缩背包dp
- ZOJ 3812 We Need Medicine(dp、背包、状态压缩、路径记录)
- HDU 4739 Zhuge Liang's Mines (状态压缩+背包DP)
- Vijos 1286 座位安排(状态压缩DP)
- hdu4739 Zhuge Liang's Mines 状态压缩dp,0-1背包
- HDU 4739 Zhuge Liang's Mines (状态压缩+背包DP)
- POJ 2923 Relocation(01背包变形, 状态压缩DP)
- Vijos 1193 扫雷(状态压缩DP)
- Vijos 1456 最小总代价(状态压缩DP)
- poj 2923 dp状态压缩+背包(两辆货车来运货)
- POJ 2923 Relocation(状态压缩DP+DP:01背包)
- HDU5135Little Zu Chongzhi's Triangles(状态压缩DP)
- hdu1074 状态压缩dp 记录路径
- hdu-4778-Gems Fight!---状态压缩dp