C的动态优化 约瑟夫环
生活随笔
收集整理的這篇文章主要介紹了
C的动态优化 约瑟夫环
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
動態(tài)規(guī)劃
代碼?
#include <stdio.h>package(int *w,int *v,int n,int c){int i,j;for(i=1;i<=m;i++){f[i][0]=0;}for(j=1;j<=c;j++){f[0][j]=0;}for(i=1;i<=n;i++){for(j=1;j<=c;i++){if(w[i]<=j&&f[i-1][j-w[i]]>f[i-1][j]){f[i][j]=f[i-1][j-w[i]]+v[i];}else{f[i][i]=f[i-1][j];}}printf("max:"f[n][c]); } void result(n,c,*res,*v,*w){int i,j;j=c;for(i=1;i>=1;i++){if(f[i][j]!=f[i-1][j]){res[i]=1;j=j-w[i];}} }int main(){int w[6]={0,1,2,3,4,5};int v[6]={0,2,3,4,5,7};int res[5]={0,0,0,0,0};int n=5;int c=10;int f[10][100];int i,j;// 獲得最大值package(w,v,n,c);// 輸出矩陣for(i=0;i<=n;i++){for(j=0;j<=c;j++){printf("%2d",f[i][j]);}}// 獲得組合result(n,c,res,v,w);// 進行輸出printf("input bag thing is:\n");for(i=1;i<=n;i++){if(res[i]==1){printf("%d ",i);}} }思路
定義 1.定義重量 價值 背包的個數(shù) 背包的重量 2.數(shù)組表示的價值 i第幾個 j表示重量 f表示背包處理函數(shù) 1.參數(shù) 重量 價值 背包個數(shù) 背包重量 2.定義i j 意思i表示個數(shù) j表示重量 3.遍歷循環(huán)賦值為0 4.二維循環(huán) 5.判斷 第i個物品的重量小于背包的重量 并且前一個的加上價值 大于之前的 6.判斷 第i個物品與之前的價值相同 7.輸出最大值 8.遍歷循環(huán)出矩陣最優(yōu)解 1.定義 背包個數(shù) 背包重量 結(jié)果數(shù)組 v價值 w重量 2.定義 i表示的是個數(shù) j表示的重量 j=c 3.倒敘循環(huán) i表示的是個數(shù) 循環(huán)到1 4.如果后一個不等于之前的 那么res置1 重量變輕再循環(huán) 5.輸出 如果res[i]為1的話 那么就輸出i約瑟夫環(huán)
#include <stdio.h> #define N 17 // 人數(shù) #define M 2 // 出局人個數(shù) void main() {// a數(shù)組表示出局的標(biāo)志 i計數(shù) call_n報數(shù) outint a[N], i=0, call_n = 0, out_n = 0;// 先都附一個零 表示都是有效的for (i = 0; i < N; i++){a[i] = 0;}while(out_n<N){ //循環(huán)報數(shù)if(a[i] == 0){ //如果健在 健在的標(biāo)志是a[i]=0call_n++; //報數(shù) Call_n就是指的數(shù)字call_n %= M; //最大為M 到了M就從0開始if(call_n == 0){ //如果能夠整除 就進行出局 并且設(shè)置a[i]=1出局的標(biāo)志 out_n表示的是出局的個數(shù)a[i] = 1; //出局標(biāo)記out_n++;printf("%d ", i + 1); //顯示出局人號碼}}i++; //直接i%=N; //循環(huán)轉(zhuǎn)向下一人} }?
總結(jié)
以上是生活随笔為你收集整理的C的动态优化 约瑟夫环的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么北上广深的人口会外流?
- 下一篇: HTTP强制设置状态码