There’s no infinite loop, it’s just really, really inefficient. Try caching the results of rec, and you’ll get a speedy result.
#include <iostream>
using namespace std;
long long int p[10],w[10];
long long int cache[10000] = {0};
long long int rec(long long int n,long long int d){
if(n<=0) return 0;
if (cache[n] != 0) return cache[n];
long long int mini=INT_MAX;
for(long long int i=0;i<=5;i++){
mini=min(mini,p[i]+rec(n-w[i],d+1));
}
cache[n] = mini;
return mini;
}
int main(){
long long int n=9680;
p[0]=10,p[1]=12,p[2]=22,p[3]=100,p[4]=32,p[5]=10;
w[0]=20,w[1]=35,w[2]=5,w[3]=40,w[4]=95,w[5]=120;
cout<<rec(n,1);
}