poj Washing Clothes挺好的一道01背包
2011-08-17 18:44
246 查看
这道题算是01背包的的灵活运用吧!!!挺好的一道题,先说说思路,先用结构体存时间,和衣服颜色 再将颜色排个序,一样的颜色放一起,然后将同一种的颜色时间加一起sum,sum在除2,对这个进行01背包,尽量能取到sum的中间值,这样消耗的时间最少。
#include<iostream>
using namespace std;
#include<algorithm>
int temp[11];
int dp[100009];
struct node
{
int time;
char clo[11];
}a[105];//用结构体存时间,和衣服颜色
bool cmp(node a,node b)//对衣服进行排序
{
return strcmp(a.clo,b.clo)>0;
}
int main()
{
int m,n;
int b[105];
while(cin>>m>>n,m||n)
{
for(int i=0;i<=100009;i++)//对数组初始化
dp[i]=0;
while(m--)
scanf("%s",temp);
for(int i=1;i<=n;i++)
scanf("%d%s",&a[i].time,a[i].clo);
a[n+1].clo[0]='0';//这个不能忘啊
sort(a+1,a+1+n,cmp);//
int cou=1;
int sum=0;
int tsum=0;
int time;
int sign=0;
for(int i=1;i<=n;i++)
{
if(strcmp(a[i].clo,a[i+1].clo)==0)
{
b[cou++]=a[i].time;//将一种衣服颜色放在数组b里
sum+=a[i].time;
}
else
{
b[cou++]=a[i].time;
sum+=a[i].time;
int t=sum/2;
for(int i=1;i<cou;i++)//01背包的过程
{
for(int j=t;j>=b[i];j--)
{
dp[j]=max(dp[j-b[i]]+b[i],dp[j]);
}
}
time=max(dp[t],sum-dp[t]);
sign=1; //计算完一种颜色的衣服后,别忘了初始化
cou=1;//计算完一种颜色的衣服后,别忘了初始化
sum=0; //计算完一种颜色的衣服后,别忘了初始化
for(int i=0;i<=100009;i++)//计算完一种颜色的衣服后,别忘了初始化
dp[i]=0;
}
if(sign==1)//将每种颜色的衣服加起来
{
tsum+=time;
sign=0;
}
}
cout<<tsum<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
#include<algorithm>
int temp[11];
int dp[100009];
struct node
{
int time;
char clo[11];
}a[105];//用结构体存时间,和衣服颜色
bool cmp(node a,node b)//对衣服进行排序
{
return strcmp(a.clo,b.clo)>0;
}
int main()
{
int m,n;
int b[105];
while(cin>>m>>n,m||n)
{
for(int i=0;i<=100009;i++)//对数组初始化
dp[i]=0;
while(m--)
scanf("%s",temp);
for(int i=1;i<=n;i++)
scanf("%d%s",&a[i].time,a[i].clo);
a[n+1].clo[0]='0';//这个不能忘啊
sort(a+1,a+1+n,cmp);//
int cou=1;
int sum=0;
int tsum=0;
int time;
int sign=0;
for(int i=1;i<=n;i++)
{
if(strcmp(a[i].clo,a[i+1].clo)==0)
{
b[cou++]=a[i].time;//将一种衣服颜色放在数组b里
sum+=a[i].time;
}
else
{
b[cou++]=a[i].time;
sum+=a[i].time;
int t=sum/2;
for(int i=1;i<cou;i++)//01背包的过程
{
for(int j=t;j>=b[i];j--)
{
dp[j]=max(dp[j-b[i]]+b[i],dp[j]);
}
}
time=max(dp[t],sum-dp[t]);
sign=1; //计算完一种颜色的衣服后,别忘了初始化
cou=1;//计算完一种颜色的衣服后,别忘了初始化
sum=0; //计算完一种颜色的衣服后,别忘了初始化
for(int i=0;i<=100009;i++)//计算完一种颜色的衣服后,别忘了初始化
dp[i]=0;
}
if(sign==1)//将每种颜色的衣服加起来
{
tsum+=time;
sign=0;
}
}
cout<<tsum<<endl;
}
return 0;
}
相关文章推荐
- POJ Washing Clothes 洗衣服 (01背包,微变型)
- poj&nbsp;3211&nbsp;Washing&nbsp;Clothes&nbsp;背包
- POJ 状态DP+ 01 背包问题
- POJ 3624 Charm Bracelet (01背包 + 内存优化)
- POJ-2184 Cow Exhibition(01背包变形)
- poj 2151 01背包
- 解题报告:POJ 1837 Balance 01背包变形
- poj 1837 Balance (01背包变形)
- POJ 3624【水01背包】
- 【01背包变形】POJ 2184 Cow Exhibition
- POJ 3628 Bookshelf2 / POJ 3624 Charm Bracelet / POJ 1384 初涉01背包与完全背包
- POJ 2184 Cow Exhibition (01背包变形)(或者搜索)
- POJ 1837 Balance(01背包 动态规划)
- POJ 3624 Charm Bracelet(01背包模板题)
- POJ 3624 Charm Bracelet【裸01背包和关于贪心解 01 背包问题的思考】
- POJ 2184 Cow Exhibition(01背包变形)
- poj 3628 Bookshelf 2 01背包
- POJ 3211 Washing Clothes(01背包变型)
- POJ 3624 Charm Bracelet (01)(背包入门)
- POJ - 3624 01背包