資料ETL_Python核心內容概覽_系統學習
阿新 • • 發佈:2020-10-29
#include<stdio.h> #include<stdlib.h> int V[100][100];//前i個物品裝入容量為j的揹包中獲得的最大價值 int max(int a,int b){ if(a>=b) return a; else return b; } int KnapSack(int n,int weight[],int value[],int C){ //填表,其中第一行和第一列全為0,即 V(i,0)=V(0,j)=0; for(int i=0;i<=n;i++) V[i][0]=0;for(int j=0;j<=C;j++) V[0][j]=0; //用到的矩陣部分V[n][C] ,下面輸出中並不輸出 第1行和第1列 printf("name weight value "); //選單欄 1 for(int i=1;i<=C;i++) printf(" %2d ",i); printf("\n\n"); for(int i=1;i<=n;i++){ printf("%2d %2d %2d ",i,weight[i-1],value[i-1]); //選單欄 2 (weight與value都是從0開始存的,所以開始i=1時對應0的位置) for(int j=1;j<=C;j++){ if(j<weight[i-1]){ //包的容量比該商品體積小,裝不下,此時的價值與前i-1個的價值是一樣的 V[i][j]=V[i-1][j]; printf("%2d ",V[i][j]); } else{ //還有足夠的容量可以裝該商品,但裝了也不一定達到當前最優價值,所以在裝與不裝之間選擇最優的一個V[i][j]=max(V[i-1][j],V[i-1][j-weight[i-1]]+value[i-1]); printf("%2d ",V[i][j]); } } printf("\n"); } return V[n][C]; } void Judge(int C,int n,int weight[]){ //判斷哪些物品被選中 int j=C; int *state=(int *)malloc(n*sizeof(int)); for(int i=n;i>=1;i--){ if(V[i][j]>V[i-1][j]){ //如果裝了就標記,然後減去相應容量 state[i]=1; j=j-weight[i-1]; } else state[i]=0; } printf("選中的物品是:"); for(int i=1;i<=n;i++) if(state[i]==1) printf("%d ",i); printf("\n"); } int main(){ int n; //物品數量 int Capacity;//揹包最大容量 printf("請輸入揹包的最大容量:"); scanf("%d",&Capacity); printf("輸入物品數:"); scanf("%d",&n); int *weight=(int *)malloc(n*sizeof(int));//物品的重量 int *value=(int *)malloc(n*sizeof(int)); //物品的價值 printf("請分別輸入物品的重量:"); for(int i=0;i<n;i++) scanf("%d",&weight[i]); printf("請分別輸入物品的價值:"); for(int i=0;i<n;i++) scanf("%d",&value[i]); int s=KnapSack(n,weight,value,Capacity); //獲得的最大價值 Judge(Capacity,n,weight); //判斷那些物品被選擇 printf("最大物品價值為: "); printf("%d\n",s); return 0; }