回溯第一题
#include <iostream>
#include<string>
#include<vector>
#include<stack>
#include<vector>
using namespace std;
int max = 0;
void dfs(vector<int> number, vector<int> capacity,
int n, int m, int index1, int index2, int corrent);
int main(int argc, char* argv[])
{
int n;
int t;
int m;
while (cin >> n)
{
cin >> t;
cin >> m;
vector<int> number(n);
for (int i = 0; i < n; i++)
{
cin >> number[i];
}
vector<int> capacity(m);
for (int i = 0; i < m; i++)
{
capacity[i] = t;
}
int index1 = 0;
int index2 = 0;
int corrent = 0;
dfs(number,capacity, n, m,0,0,0 );
cout << max << endl;
}
return 0;
}
void dfs(vector<int> number, vector<int> capacity,
int n, int m, int index1,int index2,int corrent)
{
if (index1 == n||index2==m)
{
if (corrent > max)
max = corrent;
return;
}
if (capacity[index2] >= number[index1])
{
capacity[index2] = capacity[index2] - number[index1];
index1++;
corrent++;
dfs(number, capacity, n, m, index1, index2, corrent);
index1--;
capacity[index2] = capacity[index2] +number[index1];
corrent--;
}
else if (capacity[index2] <= number[index1] &&
index2 + 1 < m&&capacity[index2 + 1] > number[index1])
{
index2++;
capacity[index2] = capacity[index2] - number[index1];
index1++;
corrent++;
dfs(number, capacity, n, m, index1, index2, corrent);
index1--;
corrent--;
capacity[index2] = capacity[index2] + number[index1];
index2--;
}
index1++;
dfs(number, capacity, n, m, index1, index2, corrent);
index1--;
}
#include <iostream>
using namespace std;
void get(int *a, int N,int i, int M, int j, int T, int k, int num, int& max){
//存在第j个背包
if(j<=M && i<=N){
//取第i个物品
if(a[i-1] <= k){
//第j个背包放得下物品i
if(max < (num+1)) max = num+1;
get(a,N,i+1,M,j,T,k-a[i-1],num+1,max);
}
else{
//第j个背包放不下物品i,所以决定扔掉第j个背包
get(a,N,i,M,j+1,T,T,num,max);
}
//不取第i个物品
get(a,N,i+1,M,j,T,k,num,max);
}
}
int main(){
int N,T,M;
int max;
while(cin>>N>>T>>M){
if((N>=1&&N<=20)&&(T>=1&&T<=20)&&(M>=1&&M<=20)){
int *a = new int[N];
for(int i=0;i<N;i++)
cin>>a[i];
max = 0;
get(a,N,1,M,1,T,T,0,max);
cout<<max<<endl;
delete []a;
}
}
return 0;
}