poj3211-01背包变形
2014-01-21 00:34
218 查看
这里要求洗衣服不能串色,同盆只能洗相同颜色的衣服,而相同颜色的衣服会有若干件,同时又是两个人一起洗,可以将这个问题转化为01背包问题,对每一种颜色的衣服进行01背包,首要问题是解决两个人同洗的问题,两个人同洗也就是2倍的速度,但一件衣服只能一个人洗,所以又不能单把同种颜色的衣服的时间折半分摊给两个人,但这里可以获得一个启示,要想节约时间,那么两个人的工作量应该接近,我们不妨这样来转化,假设某种颜色衣服的耗费时间为sum,取他的一半,mid=sum/2;然后以Mid为该种颜色的容量进行01背包,求出不超过此容量的可洗衣服的最大化,也就是接近Mid值的但却不超过mid的衣服量,然后用sum-dp[mid]就可以得到这个颜色的最佳洗衣方案,仔细想一下就明白了,sum-dp[mid]才是实际最少耗费时间,因为之前说过分摊尽可能接近Mid的两堆衣服,但完成时间肯定以时间较多的那堆为准,然后把所有颜色的耗费加起来就得到答案了。
这个题是01背包运用很好的一个启示,要灵活,对于颜色统计可以利用stl减轻负担。
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<cstring>
using namespace std;
int main(){
map <string,int> match;
vector<int> col[15];
int n,m,dp[15][15005],ans;
while(cin>>m>>n){
if(m==0&&n==0)break;
else{
match.clear();
for(int i=1; i<=m; i++){
string s;
cin>>s;
match[s]=i;
col[i].clear();
}
for(int i=1; i<=n; i++){
int w;
string s;
cin>>w; cin>>s;
col[match[s]].push_back(w);
}
ans=0;//初始化
memset(dp,0,sizeof(dp));
for(int i=1; i<=m; i++){//对每种颜色进行01背包,求dp[mid]的最大值,即在有限时间内洗尽可能多的衣服
int sum=0,mid;
for(int j=0; j<col[i].size(); j++)sum+=col[i][j];
mid=sum/2;
for(int j=0; j<col[i].size(); j++){
for(int k = mid; k>=col[i][j]; k--){
dp[i][k]=max(dp[i][k],dp[i][k-col[i][j]]+col[i][j]);
}
}
ans+=sum-dp[i][mid];
}
cout<<ans<<endl;
}
}
return 0;
}
这个题是01背包运用很好的一个启示,要灵活,对于颜色统计可以利用stl减轻负担。
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<cstring>
using namespace std;
int main(){
map <string,int> match;
vector<int> col[15];
int n,m,dp[15][15005],ans;
while(cin>>m>>n){
if(m==0&&n==0)break;
else{
match.clear();
for(int i=1; i<=m; i++){
string s;
cin>>s;
match[s]=i;
col[i].clear();
}
for(int i=1; i<=n; i++){
int w;
string s;
cin>>w; cin>>s;
col[match[s]].push_back(w);
}
ans=0;//初始化
memset(dp,0,sizeof(dp));
for(int i=1; i<=m; i++){//对每种颜色进行01背包,求dp[mid]的最大值,即在有限时间内洗尽可能多的衣服
int sum=0,mid;
for(int j=0; j<col[i].size(); j++)sum+=col[i][j];
mid=sum/2;
for(int j=0; j<col[i].size(); j++){
for(int k = mid; k>=col[i][j]; k--){
dp[i][k]=max(dp[i][k],dp[i][k-col[i][j]]+col[i][j]);
}
}
ans+=sum-dp[i][mid];
}
cout<<ans<<endl;
}
}
return 0;
}
相关文章推荐
- HDU - 3466 Proud Merchants (01背包的变形 + 贪心)
- hdu1203(01背包微变形)
- 4000 hdu2639(01背包变形-第k大背包)
- HDU1203(01背包变形)
- HDOJ 题目2955Robberies(01背包变形)
- POJ 2923 Relocation(01背包变形, 状态压缩DP)
- 51Nod 1007 正整数分组(01背包变形)
- NYOJ 题目860 又见01背包(01背包变形)
- HDU3466-Proud Merchants(01背包变形)
- 【01背包变形】POJ 2184 Cow Exhibition
- hdu 2184 01背包变形
- 最大报销额(动态规划:01背包问题变形)
- HDU - 3466 Proud Merchants (01背包的变形 + 贪心)
- Robberies小偷(01背包变形)
- Selling Souvenirs CodeForces - 808E 【01背包变形】 前缀和+三分
- POJ2184(01背包变形)
- HDU 3033 I love sneakers!(01背包变形)
- HDU 3466 01背包变形
- hdu 1574 RP问题 01背包的变形
- 九度 1499:项目安排(任务调度, 01背包变形)