動態規劃+揹包問題 擴展

//商品購買方案    動態規劃+揹包問題
/*
int price[1000];       //每件商品的價格
int count[1000];      //每件商品買了多少件
int amount[1000][1000];
int num,row=0;
void dfs(int money,int n)
{
if(n>=num)      //選擇商品的種類超過規定的品種
return;
if(money <0)     //剩餘的錢不夠買此商品
return; 
if(money == 0)     //滿足這種購買方案
{
for(int i=0;i<num;i++)
amount[row][i] = count[i];
row++;        //購買方案增加一種
}
else
{
count[n]++;
dfs(money-price[n],n);    //繼續購買本商品
count[n]--;


dfs(money,n+1);    //購買下一種商品
}
 
}


void main()
{
int i,j;
scanf("%d",&num);
for(i=0;i<num;i++)
scanf("%d",&price[i]);
dfs(1000,0);
printf("%d\n",row);
for(i=0;i<row;i++)
{
for(j=0;j<num;j++)
printf("%d ",amount[i][j]);
printf("\n");
}
}*/




// n件商品,m的本件  每件商品價格 price[0],...price[n],有多少種選擇方案
//揹包問題+動態規劃  方法1
/*
int num,row=0;     //多少種商品
int price[100];
int amount[1000][100];
int state[100];    //某種商品是否被購買,1爲購買,0沒有購買
void dfs(int money,int n)
{
if(n >=num)
return;
if(money<0)
return;
if(money == 0)
{
for(int i=0;i<num;i++)
amount[row][i] = state[i];
row++;     //購買方案加1
}
else
{
for(int j=n;j<num;j++)
{
if(state[j])
break;
state[j] = 1; 
dfs(money-price[j],n+1);
state[j] = 0;
}
}
}


void output()
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<num;j++)
if(amount[i][j])
printf("%d ",price[j]);
printf("\n");
}
}


void main()
{
int i;
scanf("%d",&num);
for(i=0;i<num;i++)
scanf("%d",&price[i]);
dfs(100,0);     //本金100
output();
}*/




//n件商品,m的本件  每件商品價格 price[0],...price[n],每種商品價值value[0]...value[n]有多少種選擇方案  
//動態規劃+揹包問題 方法2
/*
int num,row=0;     //多少種商品
int price[100],value[100]; //每件商品價格和價值
int amount[1000][100];   
int state[100];    //某種商品是否被購買,1爲購買,0沒有購買
int max=0,maxnum;        //最大價值的方案
void dfs(int money,int n)
{


if(n >num)
return;
if(money<0)
return;
if(money == 0)
{
for(int i=0;i<num;i++)
amount[row][i] = state[i];
row++;     //購買方案加1
}
else
{
state[n]=1;   // 購買這個商品
dfs(money-price[n],n+1);


state[n]=0;   //不購買這個商品,查看下一個商品
dfs(money,n+1);
}
}


void output()    //輸出方案的價值
{
int i,j;
for(i=0;i<row;i++)
{
int sum=0;
for(j=0;j<num;j++)
if(amount[i][j])
{printf("%d ",value[j]); sum+=value[j];}
if(sum >max)
{max= sum;maxnum=i+1;}
printf("\n");
}


printf("%d %d\n",maxnum,max);
}


void main()
{
int i;
scanf("%d",&num);
for(i=0;i<num;i++)
scanf("%d %d",&price[i],&value[i]);
dfs(100,0);     //本金100
output();
}*/




//揹包問題 + 動態規劃 


//n種商品,m的本金  每件商品價格 price[0],...price[n],每件商品的數量count[0]...count[n];
/*
int num;          //有多少種商品
int price[100];   //每件商品的價格
int count[100];  //每件商品的庫存
int amount[100][100]; 
int qcount[100];   //每種商品取的數量
int row=0;
void dfs(int money,int n)
{
if(n>num)    //取的商品種類大於商品的種類
return;
if(money <0)  //錢不夠買此種商品
return;
if(qcount[n] > count[n])  //這種商品沒有貨了
return;
if(money ==0)
{
for(int i=0;i<num;i++)
amount[row][i] = qcount[i];
row++;
}
else
{
qcount[n]++;    //購買此商品
dfs(money-price[n],n);  //繼續購買這種商品
qcount[n]--;


dfs(money,n+1); //購買下一種商品
}
}


void output()
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<num;j++)
printf("%d ",amount[i][j]);
printf("\n");
}
}
void main()
{
int i;
scanf("%d",&num);
for(i=0;i<num;i++)
scanf("%d %d",&price[i],&count[i]);   //設定每種商品價格和數量
dfs(1000,0);


output();
}*/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章