题目
TLE代码
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
bool visited[N];
int w[N];
int n, wr;
int res = INT_MAX;
bool cmp(int a, int b)
{
return a > b;
}
void dfs(int cost, int left, int cnt)
{
if(cost >= res) return;
if(cnt >= n)
{
res = min(res, cost);
return;
}
for(int i = 1; i <= n; i++)
{
if(visited[i]) continue;
visited[i] = true;
if(left < w[i])
{
dfs(cost+1, wr-w[i], cnt+1);
}
else
{
dfs(cost, left-w[i], cnt+1);
}
visited[i] = false;
}
}
int main()
{
cin >> n >> wr;
for(int i = 1; i <= n; i++) cin >> w[i];
sort(w+1, w+n+1, cmp);
dfs(1, wr, 0);
cout << res;
return 0;
}
分析
复杂度,太大了
又一个错误代码
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
int n, wr;
int w[N], sum[N];
int res = INT_MAX;
bool cmp(int a, int b)
{
return a >= b;
}
void dfs(int cat, int car)
{
if(car >= res) return;
if(cat == n)
{
res = min(res, car);
return;
}
for(int i = 0; i < car; i++)
{
if(sum[i] + w[cat] <= wr)
{
sum[i] += w[cat];
dfs(cat+1, car);
sum[i] -= w[cat];
}
}
sum[car] = w[cat];
dfs(cat+1, car+1);
sum[car] = 0;
}
int main()
{
cin >> n >> wr;
for(int i = 0; i < n; i++) cin >> w[i];
sort(w, w+n, cmp);
dfs(0, 0);
cout << res;
return 0;
}
分析
我发现排序出了问题
如果cmp中return a >b就是对的
问题
1.下面的代码的时间复杂度似乎也是级别的,为啥上面不行?
2.为啥cmp return a >= b 会造成错误?
感悟
问题得来的:
其它:
1.分支较少的节点优先遍历
2.用当前最优值剪枝
正确代码
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
int n, wr;
int w[N], sum[N];
int res = INT_MAX;
bool cmp(int a, int b)
{
return a > b;
}
void dfs(int cat, int car)
{
if(car >= res) return;
if(cat == n)
{
res = min(res, car);
return;
}
for(int i = 0; i < car; i++)
{
if(sum[i] + w[cat] <= wr)
{
sum[i] += w[cat];
dfs(cat+1, car);
sum[i] -= w[cat];
}
}
sum[car] = w[cat];
dfs(cat+1, car+1);
sum[car] = 0;
}
int main()
{
cin >> n >> wr;
for(int i = 0; i < n; i++) cin >> w[i];
sort(w, w+n, cmp);
dfs(0, 0);
cout << res;
return 0;
}